Hatena::Groupzigorou

Hackadelic Memo RSSフィード

2011-12-18

MacOSX での MySQL UDF 作成メモ

| 00:24 |  MacOSX での MySQL UDF 作成メモ - Hackadelic Memo を含むブックマーク はてなブックマーク -  MacOSX での MySQL UDF 作成メモ - Hackadelic Memo

$ tree 
.
├── Makefile
├── include
│   └── lib_mysqludf_calc_distance.h
└── src
    └── lib_mysqludf_calc_distance.c

みたいなディレクトリ構成にしておいて、それぞれのファイルは no title みたいにしといた。

gcc のオプションが全然覚えられないw

See Also

TabishTabish2012/07/18 21:46That's way the bestest awsenr so far!

rjtipfcbaklrjtipfcbakl2012/07/19 19:45CjIbCq <a href="http://qkreedrlyxqs.com/">qkreedrlyxqs</a>

aluttbhaluttbh2012/07/21 03:33PgqsZT <a href="http://xlwplmecthdf.com/">xlwplmecthdf</a>

pjzujnwvyqpjzujnwvyq2012/07/21 11:436VheAi , [url=http://bjpagwbcdjcd.com/]bjpagwbcdjcd[/url], [link=http://jztbgjdhyihx.com/]jztbgjdhyihx[/link], http://wazbvmzhrpap.com/

トラックバック - http://zigorou.g.hatena.ne.jp/ZIGOROu/20111218

2011-12-08

fifo, nonblocking

| 03:56 |  fifo, nonblocking - Hackadelic Memo を含むブックマーク はてなブックマーク -  fifo, nonblocking - Hackadelic Memo

メモですよ。

use strict;
use warnings;

use Errno;
use IO::File;
use POSIX qw(mkfifo);

my $fifo = "/path/to/named.pipe";

unless (-p $fifo) {
    ### man 2 mkfifo
    mkfifo($fifo, 0755) or die($!);
}

### Errno::ENXIO (man 7 fifo, http://linux.die.net/man/7/fifo)
my $fh = IO::File->new($fifo, O_APPEND|O_WRONLY|O_NONBLOCK) or die($!);

$SIG{PIPE} = "IGNORE";

### Error::EPIPE
$fh->print("xxxxxxxxx\n") or die($!);
$fh->flush or die($!);

とりあえずこのコードは動作確認してない。

メモとしては、

  • mkfifo(2) の時は man 2 mkfifo 見る
    • $!{EEXIST} の時はエラーにしなくても良いかも (-p が false でも多分あり得る)
  • open(2) の際は O_NONBLOCK にして開くと reader が無くても open(2) で block はしない
    • 但し reader が居ないと $! == Errno::ENXIO となるので、fifo に書き込みたい内容を buffering するとか?
  • writer が reader 無しで何か書き込もうとすると SIGPIPE が発生しちゃうので IGNORE しとく
    • この時 $! == Errno::EPIPE なんで、この場合は reader が復活しても、$fh を作り直す必要がある
  • fifo に書き込める buffer にも上限があって、この際は Errno::EAGAIN になる。
    • 上限値がいまいち分からない。PIPE_BUF とか関係してんのかな。

こんな感じで reader の状態に応じてエラーハンドリングが出来るんじゃないかなーと思ってる。

そういえば、telnet で NUL バイトを送る場合は ^V^@ らしい。

See Also

GakuGaku2014/03/01 00:07Keep on writing and chginugg away!

AmseyAmsey2014/03/01 11:13If my problem was a Death Star, this article is a photon <a href="http://dnippxh.com">tordepo.</a>

CarlosCarlos2014/03/02 10:09Glad I've finally found sotnmhieg I agree with! http://ncvjxadashb.com [url=http://prdbtndv.com]prdbtndv[/url] [link=http://puxksra.com]puxksra[/link]

RochelleRochelle2014/03/04 16:19That's a smart way of <a href="http://hcfndf.com">lokoing</a> at the world.

MiljaMilja2014/03/05 19:51At last! Someone with the insight to solve the promleb! http://ytvzmcqupim.com [url=http://qjbuujht.com]qjbuujht[/url] [link=http://czvfagqpo.com]czvfagqpo[/link]

トラックバック - http://zigorou.g.hatena.ne.jp/ZIGOROu/20111208

2009-06-29簡単なお仕事をするだけで年収X百万

DBI wrapper の妄想

| 01:15 |  DBI wrapper の妄想 - Hackadelic Memo を含むブックマーク はてなブックマーク -  DBI wrapper の妄想 - Hackadelic Memo

世の中 async なのに、未だにこのレベルの話。

前提は、

  • SQL は普通に書かざるを得ない
  • なるべく使う側のステップを減らしたいし可読性を高めたい

とか。

#!/usr/bin/perl

use utf8;
use strict;
use warnings;

use DBI;
use MyDBI;

my $dbh = DBI->connect('dbi:mysql:database=diary', 'zigorou', '', +{ RaiseError => 1, AutoCommit => 0 });
my $dbi = MyDBI->new($dbh);

my $query = << 'QUERY';
SELECT 
  diary_id, title, content, created_on, updated_on 
FROM 
  diary 
WHERE 
  diary_id IN(:diary_id_set(int)[]:) 
  AND 
  created_on > :(int)yesterday(datetime):
ORDER BY 
  created_on 
LIMIT 
  :limit(int):
OFFSET 
  :offset(int):
QUERY

my $rs = $dbi->execute(
    $query, 
    +{ 
        binds => +{ 
          diary_id_set => [ 1..10 ], 
          yesterday    => DateTime->today->subtract( days => 1 ), 
          limit        => 10, 
          offset       => 0 
        },
        deflate => [
            qr/_on$/ => [ to('int' => 'datetime') ],
            title      => [ qw/utf8/ ],
            subject    => [ qw/utf8/ ],
        ]
    }
);

while ($rs->has_next) {
    my $row = $rs->next;
    printf("%s (%s)\n", 
           $row->subject, 
           $row->created_on->strftime('%Y%m%d'));
}

$rs->finish;
  • named placeholder 的に
  • とりあえず inflate は SQL に埋め込む
  • deflate は個別に指定、パターンで制御出来てもいいかも

みたいなのを基本にして、

  • id 一覧だけ取得して、別のテーブルに IN 指定して、後から rs を merge
  • id 分割してる奴とか透過的に扱える
    • 非同期化も透過的に
  • 予め指定した Cache の適用も透過的に

とかそういう DBI の wrapper が欲しいと思う今日この頃。多分 Data::ObjectDriver が一番答えに近いとは思うんだけど。

トラックバック - http://zigorou.g.hatena.ne.jp/ZIGOROu/20090629

2009-04-12

トラックバック - http://zigorou.g.hatena.ne.jp/ZIGOROu/20090412

2009-03-29

perlxs (6)

| 01:06 |  perlxs (6) - Hackadelic Memo を含むブックマーク はてなブックマーク -  perlxs (6) - Hackadelic Memo

The PREINIT: Keyword

まずは実際の例。

bool_t
rpcb_gettime(timep)
INPUT:
	time_t timep = NO_INIT
PREINIT:
	char *host = "localhost";
CODE:
	RETVAL = rpcb_gettime(host, &timep);
OUTPUT:
	timep
	RETVAL

とすると、

XS(XS_RPC_rpcb_gettime); /* prototype to pass -Wmissing-prototypes */
XS(XS_RPC_rpcb_gettime)
{
    dXSARGS;
    if (items != 1)
	Perl_croak(aTHX_ "Usage: RPC::rpcb_gettime(timep)");
    {
	time_t	timep;
#line 72 "RPC.xs"
	char *host = "localhost";
#line 42 "RPC.c"
	bool_t	RETVAL;
	dXSTARG;
#line 74 "RPC.xs"
	RETVAL = rpcb_gettime(host, &timep);
#line 47 "RPC.c"
	sv_setnv(ST(0), (NV)timep);
	SvSETMAGIC(ST(0));
	XSprePUSH; PUSHi((IV)RETVAL);
    }
    XSRETURN(1);
}

となる。

これを PREINIT: キーワードではなく、CODE: に持ってくる。

bool_t
rpcb_gettime(timep)
INPUT:
	time_t timep = NO_INIT
CODE:
	char *host = "localhost";
	RETVAL = rpcb_gettime(host, &timep);
OUTPUT:
	timep
	RETVAL

make すると、

XS(XS_RPC_rpcb_gettime); /* prototype to pass -Wmissing-prototypes */
XS(XS_RPC_rpcb_gettime)
{
    dXSARGS;
    if (items != 1)
	Perl_croak(aTHX_ "Usage: RPC::rpcb_gettime(timep)");
    {
	time_t	timep;
	bool_t	RETVAL;
	dXSTARG;
#line 72 "RPC.xs"
	char *host = "localhost";
	RETVAL = rpcb_gettime(host, &timep);
#line 45 "RPC.c"
	sv_setnv(ST(0), (NV)timep);
	SvSETMAGIC(ST(0));
	XSprePUSH; PUSHi((IV)RETVAL);
    }
    XSRETURN(1);
}

CODE: で初期化すると typemap による変換後なので、以下のような XSUB の場合は、その効力が発揮される。

MyObject
mutate(o)
PREINIT:
    MyState st = global_state;
INPUT:
    MyObject o;
CLEANUP:
    reset_to(global_state, st);

CODE: での初期化を安全にやる場合はブレースで囲ってやればよいらしい。

CODE:
	{
		char *host = "localhost";
		RETVAL = rpcb_gettime(host, &timep);
	}

でこれらの議論を元に、C_ARGS: キーワードを新たに適用すると、

bool_t
rpcb_gettime(timep)
INPUT:
	time_t timep = NO_INIT;
	char *host = "localhost";
C_ARGS:
	host, &timep
OUTPUT:
	timep
	RETVAL

と書き直すことが出来ると。

XS(XS_RPC_rpcb_gettime); /* prototype to pass -Wmissing-prototypes */
XS(XS_RPC_rpcb_gettime)
{
    dXSARGS;
    if (items != 1)
	Perl_croak(aTHX_ "Usage: RPC::rpcb_gettime(timep)");
    {
	time_t	timep;
	char *	host = "localhost";
	bool_t	RETVAL;
	dXSTARG;

	RETVAL = rpcb_gettime(host, &timep);
	sv_setnv(ST(0), (NV)timep);
	SvSETMAGIC(ST(0));
	XSprePUSH; PUSHi((IV)RETVAL);
    }
    XSRETURN(1);
}

のようになりますと。

perlxs (5)

| 17:22 |  perlxs (5) - Hackadelic Memo を含むブックマーク はてなブックマーク -  perlxs (5) - Hackadelic Memo

Initializing Function Parameters

bool_t
rpcb_gettime(host, timep)
INPUT:
	char *host = (char *)SvPV($arg, PL_na); /* $arg, $var, $type */
	time_t &timep = 0; /* $arg, $var, $type */
OUTPUT:
	timep

とすると、

XS(XS_RPC_rpcb_gettime); /* prototype to pass -Wmissing-prototypes */
XS(XS_RPC_rpcb_gettime)
{
    dXSARGS;
    if (items != 2)
	Perl_croak(aTHX_ "Usage: RPC::rpcb_gettime(host, timep)");
    {
	char *	host = (char *)SvPV(ST(0), PL_na); /* ST(0), host, char * */
	time_t	timep = 0; /* ST(1), timep, time_t */
	bool_t	RETVAL;
	dXSTARG;

	RETVAL = rpcb_gettime(host, &timep);
	sv_setnv(ST(1), (NV)timep);
	SvSETMAGIC(ST(1));
	XSprePUSH; PUSHi((IV)RETVAL);
    }
    XSRETURN(1);
}

となる。INPUT: ブロックで色々出来るんだけど、これはよくないやり方だそうだ。

ちなみに $arg, $var, $type を INPUT: で使った時の対比も分かりやすい。

一方で、

bool_t
rpcb_gettime(host, timep)
INPUT:
	time_t &timep; /* \$v{timep}=@{[$v{timep}=$arg]} */
	char *host + SvOK($v{timep}) ? SvPV($arg,PL_na) : NULL;
OUTPUT:
	timep

と言う、"=" 以外の初期化の例とグローバル変数 %v の使い方、、、なんだが、これは覚えなくても良い気がする。

XS(XS_RPC_rpcb_gettime); /* prototype to pass -Wmissing-prototypes */
XS(XS_RPC_rpcb_gettime)
{
    dXSARGS;
    if (items != 2)
	Perl_croak(aTHX_ "Usage: RPC::rpcb_gettime(host, timep)");
    {
	time_t	timep;
	char *	host = (char *)SvPV_nolen(ST(0));
	bool_t	RETVAL;
	dXSTARG;

	 /* $v{timep}=ST(1) */

	 SvOK(ST(1)) ? SvPV(ST(0),PL_na) : NULL;

	RETVAL = rpcb_gettime(host, &timep);
	sv_setnv(ST(1), (NV)timep);
	SvSETMAGIC(ST(1));
	XSprePUSH; PUSHi((IV)RETVAL);
    }
    XSRETURN(1);
}

Default Parameter Values

host が第一引数だとデフォルト値を設定出来ないので逆にすると。

bool_t
rpcb_gettime(timep, host="localhost")
INPUT:
	char *host
	time_t timep = NO_INIT
CODE:
	RETVAL = rpcb_gettime(host, &timep);
OUTPUT:
	timep
	RETVAL

とすると

XS(XS_RPC_rpcb_gettime); /* prototype to pass -Wmissing-prototypes */
XS(XS_RPC_rpcb_gettime)
{
    dXSARGS;
    if (items < 1 || items > 2)
	Perl_croak(aTHX_ "Usage: RPC::rpcb_gettime(timep, host=\"localhost\")");
    {
	char *	host;
	time_t	timep;
	bool_t	RETVAL;
	dXSTARG;

	if (items < 2)
	    host = "localhost";
	else {
	    host = (char *)SvPV_nolen(ST(1));
	}
#line 62 "RPC.xs"
	RETVAL = rpcb_gettime(host, &timep);
#line 51 "RPC.c"
	sv_setnv(ST(0), (NV)timep);
	SvSETMAGIC(ST(0));
	XSprePUSH; PUSHi((IV)RETVAL);
    }
    XSRETURN(1);
}

おおお、xsubpp すげー。

perlxs (4)

| 16:53 |  perlxs (4) - Hackadelic Memo を含むブックマーク はてなブックマーク -  perlxs (4) - Hackadelic Memo

The CODE: Keyword

bool_t
rpcb_gettime(host, timep)
	char *host
	time_t &timep
CODE:
	RETVAL = rpcb_gettime(host, &timep);
OUTPUT:
	timep
	RETVAL

のようにすると、

bool_t 
rpcb_gettime(host, timep)
	char *host
	time_t &timep
OUTPUT:
	timep

と同じ意味になる。即ち、

  • RETVAL に rpcb_gettime() の戻り値 bool_t を設定
    • OUTPUT: のみの方は CODE: が無いので自動的に戻り値の型から typemap を用いて生成
  • また ST(1) に timep を設定しなおす

と言う状態。

XS(XS_RPC_rpcb_gettime); /* prototype to pass -Wmissing-prototypes */
XS(XS_RPC_rpcb_gettime)
{
    dXSARGS;
    if (items != 2)
	Perl_croak(aTHX_ "Usage: RPC::rpcb_gettime(host, timep)");
    {
	char *	host = (char *)SvPV_nolen(ST(0));
	time_t	timep = (time_t)SvNV(ST(1));
	bool_t	RETVAL;
	dXSTARG;
#line 27 "RPC.xs"
	RETVAL = rpcb_gettime(host, &timep);
#line 45 "RPC.c"
	sv_setnv(ST(1), (NV)timep);
	SvSETMAGIC(ST(1));
	XSprePUSH; PUSHi((IV)RETVAL);
    }
    XSRETURN(1);
}

のようになる。

The INIT: Keyword

INIT: キーワードは CODE: より前に行う処理で、さらに RETVAL に関しては何も影響しない部分。

bool_t
rpcb_gettime(host, timep)
	char *host
	time_t &timep
INIT:
	PerlIO_printf(PerlIO_stderr(), "[debug] host is %s\n", host);
CODE:
	RETVAL = rpcb_gettime(host, &timep);
OUTPUT:
	timep
	RETVAL

などのようにすると、

XS(XS_RPC_rpcb_gettime); /* prototype to pass -Wmissing-prototypes */
XS(XS_RPC_rpcb_gettime)
{
    dXSARGS;
    if (items != 2)
	Perl_croak(aTHX_ "Usage: RPC::rpcb_gettime(host, timep)");
    {
	char *	host = (char *)SvPV_nolen(ST(0));
	time_t	timep = (time_t)SvNV(ST(1));
	bool_t	RETVAL;
	dXSTARG;
#line 27 "RPC.xs"
	PerlIO_printf(PerlIO_stderr(), "[debug] host is %s\n", host);
#line 45 "RPC.c"
#line 29 "RPC.xs"
	RETVAL = rpcb_gettime(host, &timep);
#line 48 "RPC.c"
	sv_setnv(ST(1), (NV)timep);
	SvSETMAGIC(ST(1));
	XSprePUSH; PUSHi((IV)RETVAL);
    }
    XSRETURN(1);
}

のようになる。

またもう一個の例で long long を使ってるが、これに typemap が無いので今回は long でやる。

long
ldiv(a, b)
	long a
	long b
INIT:
	if (a == 0 && b == 0)
		XSRETURN_UNDEF;
	if (b == 0)
		croak("ldiv: cannot divide by 0");
CODE:
	RETVAL = a / b;
OUTPUT:
	RETVAL

のように入力値のバリデーションなんかも INIT: キーワードでやると良い。

The NO_INIT Keyword

bool_t 
rpcb_gettime(host, timep)
	char *host
	time_t &timep = NO_INIT
OUTPUT:
	timep

NO_INIT: のあるなしは、ない場合は、

time_t	timep = (time_t)SvNV(ST(1));

となるが、ある場合は、

time_t	timep;

となると言う事。

またこの第2引数が出力として扱われる事も意味しているので、XSUB の実行終了間際で、

sv_setnv(ST(1), (NV)timep);

が行われている。

トラックバック - http://zigorou.g.hatena.ne.jp/ZIGOROu/20090329

2009-03-28

perlxs (3)

| 01:17 |  perlxs (3) - Hackadelic Memo を含むブックマーク はてなブックマーク -  perlxs (3) - Hackadelic Memo

さて、続き。

The MODULE Keyword

MODULE = RPC

があると XS のコードの開始って意味。package RPC に置かれる。

The PACKAGE Keyword

MODULE = RPC  PACKAGE = RPC
[ XS code in package RPC ]
MODULE = RPC  PACKAGE = RPCB
[ XS code in package RPCB ]
MODULE = RPC  PACKAGE = RPC
[ XS code in package RPC ]

まぁパッケージ名を XSUB ごとに切り替えられる物ですね。

The PREFIX Keyword

MODULE = RPC PACKAGE = RPC PREFIX = rpcb_

rpcb_ を省略出来るようになる。C のライブラリは prefix が統一されてる事が多いのでそういうときに使うと。

The OUTPUT: Keyword

通常は CODE: キーワードと共に用いられ、戻り値として返す値を制御する為に使います。前の rpcb_gettime では、

bool_t 
rpcb_gettime(host, timep)
	char *host;
	time_t &timep;
OUTPUT:
	timep

のようにしてました。

これをちょっと変えて、

bool_t
rpcb_gettime(host, timep)
	char *host
	time_t &timep
OUTPUT:
	timep sv_setnv(ST(1), (double)timep);	

としてやると、

XS(XS_RPC_rpcb_gettime); /* prototype to pass -Wmissing-prototypes */
XS(XS_RPC_rpcb_gettime)
{
    dXSARGS;
    if (items != 2)
	Perl_croak(aTHX_ "Usage: RPC::rpcb_gettime(host, timep)");
    {
	char *	host = (char *)SvPV_nolen(ST(0));
	time_t	timep = (time_t)SvNV(ST(1));
	bool_t	RETVAL;
	dXSTARG;

	RETVAL = rpcb_gettime(host, &timep);
	sv_setnv(ST(1), (double)timep);
	SvSETMAGIC(ST(1));
	XSprePUSH; PUSHi((IV)RETVAL);
    }
    XSRETURN(1);
}

sv_setnv で timep を double にキャストした値を ST(1)、つまり第2引数の timep に代入すると。

一方で前の XSUB だと、

XS(XS_RPC_rpcb_gettime); /* prototype to pass -Wmissing-prototypes */
XS(XS_RPC_rpcb_gettime)
{
    dXSARGS;
    if (items != 2)
	Perl_croak(aTHX_ "Usage: RPC::rpcb_gettime(host, timep)");
    {
	char *	host = (char *)SvPV_nolen(ST(0));
	time_t	timep = (time_t)SvNV(ST(1));
	bool_t	RETVAL;
	dXSTARG;

	RETVAL = rpcb_gettime(host, &timep);
	sv_setnv(ST(1), (NV)timep);
	SvSETMAGIC(ST(1));
	XSprePUSH; PUSHi((IV)RETVAL);
    }
    XSRETURN(1);
}

自前でやっていたような処理が自動で行われているのがわかる。

xsubpp は、XSUB の OUTPUT セクション中、RETVAL を除く全てのパラメータに対して自動的に SvSETMAGIC() を出力します。これは普通は望ましい振る舞いです; なぜなら出力パラメータに適切に 'set' マジックを起動する面倒を見るからです(ハッシュや配列の要素が存在しなかったとき、作成しなければならないので必要です)。もし何らかの理由でこの振る舞いが望ましくないなら、 OUTPUT セクションの残りのパラメータでこれを無効にするために、 OUTPUT セクションには SETMAGIC: DISABLE という行を含めることが出来ます。同様に、SETMAGIC: ENABLE は OUTPUT セクションの残りのために再有効化するために使えます。 'set' マジックに関するさらなる詳細については perlguts を参照してください。 perlxs

確かに SvSETMAGIC() を両方の場合でやってますねぇ。'set' magic については事前知識は何となくあるものの、まだちゃんと学習してないので後々に詳しくやる。

The NO_OUTPUT Keyword

事前に delete_file(char *name) と言う関数をでっちあげておく。return(1) とかにして。

NO_OUTPUT int
delete_file(name)
	char *name
POSTCALL:
	if (RETVAL != 0)
		PerlIO_printf(PerlIO_stderr(), "Error %d while deleting file '%s'", RETVAL, name);

とすると、

XS(XS_RPC_delete_file); /* prototype to pass -Wmissing-prototypes */
XS(XS_RPC_delete_file)
{
    dXSARGS;
    if (items != 1)
	Perl_croak(aTHX_ "Usage: RPC::delete_file(name)");
    {
	char *	name = (char *)SvPV_nolen(ST(0));
	int	RETVAL;
	dXSTARG;

	RETVAL = delete_file(name);
#line 66 "RPC.xs"
	if (RETVAL != 0) {
		PerlIO_printf(PerlIO_stderr(), "Error %d while deleting file '%s'", RETVAL, name);
	}
#line 144 "RPC.c"
    }
    XSRETURN_EMPTY;
}

文字通り RETVAL に代入するものの、XSUB の戻り値としては何も定義しない。

perlxs (2)

| 23:50 |  perlxs (2) - Hackadelic Memo を含むブックマーク はてなブックマーク -  perlxs (2) - Hackadelic Memo

The Argument Stack

ST(x) マクロで引数スタックにアクセスする。この引数スタックは

  • XSUB に渡す引数
  • XSUB から返ってくる値

の両方を取り扱う。

多くの場合は xsubpp コンパイラが typemap に従って良しなによってくれるが、複雑な場合は自分で管理する。

The RETVAL Variable

RETVAL は void じゃない XSUB に対して xsubpp コンパイラが自動的に割り当てる C の変数。型は戻り値の型に自動的に合わせ、戻り値の ST(0) に代入される。確かに前の例だと、

bool_t rpcb_gettime(char *host, time_t *timep)

に対して、

bool_t	RETVAL;

と宣言されて、

XSprePUSH; PUSHi((IV)RETVAL);

となっている。確かに $PERLLIB/ExtUtils/typemap で、

bool_t			T_IV

と定義されてるので IV にキャストしてそれを PUSHi してる。PUSHi はスタックに整数を PUSH するマクロ。

void な XSUB に対しては RETVAL は宣言されない。perlxstut でやったときの例を出すと、

XS(XS_MyTest_hello); /* prototype to pass -Wmissing-prototypes */
XS(XS_MyTest_hello)
{
    dXSARGS;
    if (items != 0)
	Perl_croak(aTHX_ "Usage: MyTest::hello()");
    {
#line 18 "MyTest.xs"
	printf("hello world\n");
#line 35 "MyTest.c"
    }
    XSRETURN_EMPTY;
}

って感じ。

一方で PPCODE: を使った場合も RETVAL は宣言されない。この場合は自分で引数スタックを操作する。

Returning SVs, AVs and HVs through RETVAL

さて初めて SV, AV, HV を戻り値として取り扱う例。

SV * を返すだけなら次のような書き方が出来る。

void
alpha()
PPCODE:
	ST(0) = newSVpv("Hello World", 0);
	sv_2mortal(ST(0));
	XSRETURN(1);

SV *
beta()
CODE:
	RETVAL = newSVpv("Hello World", 0);
OUTPUT:
	RETVAL

これらは xsubpp によって、

XS(XS_RPC_alpha); /* prototype to pass -Wmissing-prototypes */
XS(XS_RPC_alpha)
{
    dXSARGS;
    if (items != 0)
	Perl_croak(aTHX_ "Usage: RPC::alpha()");
   PERL_UNUSED_VAR(ax); /* -Wall */
    SP -= items;
    {
#line 32 "RPC.xs"
	ST(0) = newSVpv("Hello World", 0);
	sv_2mortal(ST(0));
	XSRETURN(1);
#line 80 "RPC.c"
	PUTBACK;
	return;
    }
}

XS(XS_RPC_beta); /* prototype to pass -Wmissing-prototypes */
XS(XS_RPC_beta)
{
    dXSARGS;
    if (items != 0)
	Perl_croak(aTHX_ "Usage: RPC::beta()");
    {
	SV *	RETVAL;
#line 39 "RPC.xs"
	RETVAL = newSVpv("Hello World", 0);
#line 97 "RPC.c"
	ST(0) = RETVAL;
	sv_2mortal(ST(0));
    }
    XSRETURN(1);
}

CODE:, OUTPUT: を使った場合、ST(0) が自動的に sv_2mortal() で揮発性となるようになってる。PPCODE: の場合は自分で自発的に sv_2mortal() しないと駄目。

配列リファレンスを返したい場合は、AV * を返せば良い。

AV *
array()
CODE:
	RETVAL = newAV();
	sv_2mortal((SV*)RETVAL);
OUTPUT:
	RETVAL

ここが BK だが AV *, HV * の場合は RETVAL を (SV *) にキャストして、sv_2mortal() しないと駄目。やらないともれなくメモリリークします。

XS(XS_RPC_array); /* prototype to pass -Wmissing-prototypes */
XS(XS_RPC_array)
{
    dXSARGS;
    if (items != 0)
        Perl_croak(aTHX_ "Usage: RPC::array()");
    {
        AV *    RETVAL;
#line 46 "RPC.xs"
        RETVAL = newAV();
        sv_2mortal((SV*)RETVAL);
#line 116 "RPC.c"
        ST(0) = newRV((SV*)RETVAL);
        sv_2mortal(ST(0));
    }
    XSRETURN(1);
}

って感じになるんだけど、RV はリファレンスの事。RETVAL を SV * にキャストしてリファレンスとして生成してこれを揮発性にしてるんだけど、基の AV * に対しても mortal 化する必要があると。

なるほどですねー。

TimothybexTimothybex2017/07/01 23:43301 Moved Permanently
<a href=https://www.viagrapascherfr.com/>301 Moved Permanently!</a>

トラックバック - http://zigorou.g.hatena.ne.jp/ZIGOROu/20090328

2009-03-27

perlxs (1)

| 04:12 |  perlxs (1) - Hackadelic Memo を含むブックマーク はてなブックマーク -  perlxs (1) - Hackadelic Memo

今度は perlxs をやってみます。

いきなりなんだけど

サンプルに出てくる rpcb_gettime() って関数がどうも CentOS 5.2 では存在しないっぽぃ。rpc/rpc.h とそこから include されてるヘッダを探し回っても存在しないっぽぃので、やっぱ無いと思われる。*1

なので、まぁこんな感じで代用することにする。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <rpc/rpc.h>

bool_t rpcb_gettime(char *, time_t *);

int main(int argc, char **argv) {
	time_t t;
	bool_t st = rpcb_gettime(NULL, &t);

	if (st == TRUE)
		printf("rpcb_gettime: %d\n", (int) t);

	exit(0);
}

bool_t rpcb_gettime(char *host, time_t *t) {
	time(t);
	return(TRUE);
}

まぁとりあえずこれで良しとする。

XSUB の記述

何はともあれ XS モジュールの雛形を作成。

$ h2xs -An RPC
$ cd RPC
RPC.xs
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "ppport.h"

#include <time.h>
#include <rpc/rpc.h>

bool_t rpcb_gettime(char *host, time_t *timep) {
	time(timep);
	return(TRUE);
}

MODULE = RPC		PACKAGE = RPC		

bool_t 
rpcb_gettime(host, timep)
	char *host;
	time_t &timep;
OUTPUT:
	timep
lib/RPC.pm

今回は DynaLoader を使う。h2xs の雛形だと XSLoader が使われる。

package RPC;

use strict;
use warnings;

use Exporter;
use DynaLoader;

use base qw(Exporter DynaLoader);

our $VERSION = '0.01';
our @EXPORT_OK = qw( rpcb_gettime );

bootstrap RPC;

1;
t/00-compile.t
use Test::More;
BEGIN {
    plan tests => 1;
    use_ok('RPC');
};

t/01-gettime.t

use Test::More;
use RPC qw(rpcb_gettime);

plan tests => 5;

can_ok('RPC', qw(rpcb_gettime));

my $timep  = 0;
my $before = time();
sleep(1);
my $ret    = rpcb_gettime('localhost', $timep);
sleep(1);
my $after  = time();

ok($timep, 'rpcb_gettime() time output');
ok($ret, 'rpcb_gettime() return value');

note(sprintf("before: %d, timep: %d, after: %d", $before, $timep, $after));

cmp_ok($timep, '>=', $before, 'before rpcb_gettime() call');
cmp_ok($timep, '<=', $after,  'after rpcb_gettime() call');

出来上がった C のファイル

XS(XS_RPC_rpcb_gettime); /* prototype to pass -Wmissing-prototypes */
XS(XS_RPC_rpcb_gettime)
{
    dXSARGS;
    if (items != 2)
	Perl_croak(aTHX_ "Usage: RPC::rpcb_gettime(host, timep)");
    {
	char *	host = (char *)SvPV_nolen(ST(0));
	time_t	timep = (time_t)SvNV(ST(1));
	bool_t	RETVAL;
	dXSTARG;

	RETVAL = rpcb_gettime(host, &timep);
	sv_setnv(ST(1), (NV)timep);
	SvSETMAGIC(ST(1));
	XSprePUSH; PUSHi((IV)RETVAL);
    }
    XSRETURN(1);
}

さてこっからは真面目に読んで行こう。

SvPV_nolen

perlapi によれば、SV* の中から文字列を取り出すとある。また文字列化された形式の SvPOK をキャッシュする場合があると書いてある。

char* SvPV_nolen(SV *sv)
SvNV

SV を強制的に倍精度数値に変換する。

NV SvNV(SV *sv)
RETVAL

戻り値。今回は bool_t 型なのでそのように。

dXSTARGS

これはスタックの初期化だと思う。

perlapi の中には見出しとしては無いけど、PUSHx 系のマクロを使うために呼んでおけとある。

sv_setsv

倍精度浮動小数点数を SV * にコピー。set magic は扱わない。

void sv_setsv(SV *sv, NV num)
SvSETMAGIC

SV が set magic を持ってる時に mg_set を起動するそうな。

void SvSETMAGIC(SV* sv)

mg_set は、SV に値を代入した後に magic を設定。

int mg_set(SV* sv)

sv_magic を見ろとあるが今回はスルー。

XSprePUSH

これは perlxs には載ってないなぁ。PUSH する前に呼ばなきゃ行けないんだろう、きっと。

PUSHi

スタックに IV を突っ込む。

void PUSHi(IV iv)

set magic をハンドルするそうだ。

SEE ALSO

*1BSD系にしか無さそうな感じ

PinnickPinnick2012/07/18 22:35Wonderful explanation of facts avialbale here.

lfmtqdvlfmtqdv2012/07/19 19:435XUq5S <a href="http://sabxqpputfaj.com/">sabxqpputfaj</a>

rlwzwektnhprlwzwektnhp2012/07/20 00:47gZ0kCd , [url=http://wgsaohshrhqm.com/]wgsaohshrhqm[/url], [link=http://baprnatdyvyu.com/]baprnatdyvyu[/link], http://oqzgxsdassgu.com/

wzagizxwzagizx2012/07/21 03:32LpIEZ2 <a href="http://spejdkphfvhz.com/">spejdkphfvhz</a>

vlxiwqakklvlxiwqakkl2012/07/21 11:41Hm9wqH , [url=http://owhkcvplimln.com/]owhkcvplimln[/url], [link=http://lmphfoykfjxv.com/]lmphfoykfjxv[/link], http://ansqipocwcms.com/

YagmurYagmur2013/07/03 05:30An inlgltieent answer - no BS - which makes a pleasant change

BubbieBubbie2013/07/03 07:08Finnidg this post. It's just a big piece of luck for me.

LeventLevent2013/07/04 00:00You put the lime in the <a href="http://txauryry.com">coounct</a> and drink the article up.

LeventLevent2013/07/04 00:00You put the lime in the <a href="http://txauryry.com">coounct</a> and drink the article up.

LeventLevent2013/07/04 00:00You put the lime in the <a href="http://txauryry.com">coounct</a> and drink the article up.

MoradMorad2013/07/05 07:38You really found a way to make this whole prsceos easier. http://ifjcrvoiykz.com [url=http://rfnpsupwlr.com]rfnpsupwlr[/url] [link=http://nyxderjkeip.com]nyxderjkeip[/link]

MoradMorad2013/07/05 07:38You really found a way to make this whole prsceos easier. http://ifjcrvoiykz.com [url=http://rfnpsupwlr.com]rfnpsupwlr[/url] [link=http://nyxderjkeip.com]nyxderjkeip[/link]

MoradMorad2013/07/05 07:38You really found a way to make this whole prsceos easier. http://ifjcrvoiykz.com [url=http://rfnpsupwlr.com]rfnpsupwlr[/url] [link=http://nyxderjkeip.com]nyxderjkeip[/link]

DaiaDaia2013/07/07 10:30The paragon of <a href="http://okacdzgznhe.com">unditsrandeng</a> these issues is right here!

DaiaDaia2013/07/07 10:30The paragon of <a href="http://okacdzgznhe.com">unditsrandeng</a> these issues is right here!

DaiaDaia2013/07/07 10:30The paragon of <a href="http://okacdzgznhe.com">unditsrandeng</a> these issues is right here!

トラックバック - http://zigorou.g.hatena.ne.jp/ZIGOROu/20090327

2009-03-22

perlxstut (9)

| 05:54 |  perlxstut (9) - Hackadelic Memo を含むブックマーク はてなブックマーク -  perlxstut (9) - Hackadelic Memo

いよいよ最後の例。ファイルハンドルを使うの巻。

まずどういう訳か、fputs(3) を使いたいと。MyTest.xs で stdio.h をインクルードしておいて、

int fputs(s, stream)
	char *s
	FILE *stream

とするだけでおk。

$ perl -MExtUtils::testlib -MMyTest -le 'MyTest::fputs("foo bar\n", *STDOUT);'
foo bar

ふむふむ。

で、これだけだと Perl IO の恩恵に授かれないので、次にこうする。

int perlioputs(s, stream)
	char *s
	OutputStream stream
CODE:
	RETVAL = PerlIO_puts(stream, s);
OUTPUT:
	RETVAL

んで使ってみる。

$ perl -MExtUtils::testlib -MMyTest -le 'MyTest::perlioputs("foo bar\nbar baz\n", *STDOUT);'
foo bar
bar baz

なるほど。

本来は fputs(3) を使いたいので PerlIO_findFILE() を使う。

int perlioputs(s, stream)
	char *s
	OutputStream stream
PREINIT:
	FILE *fp = PerlIO_findFILE(stream);
CODE:
	if (fp != (FILE*) 0) {
		RETVAL = fputs(s, fp);
	}
	else {
		RETVAL = -1;
	}
OUTPUT:
	RETVAL

出来た c のコードはこんなの。

XS(XS_MyTest_perlioputs); /* prototype to pass -Wmissing-prototypes */
XS(XS_MyTest_perlioputs)
{
    dXSARGS;
    if (items != 2)
	Perl_croak(aTHX_ "Usage: MyTest::perlioputs(s, stream)");
    {
	char *	s = (char *)SvPV_nolen(ST(0));
	OutputStream	stream = IoOFP(sv_2io(ST(1)));
#line 111 "MyTest.xs"
	FILE *fp = PerlIO_findFILE(stream);
#line 204 "MyTest.c"
	int	RETVAL;
	dXSTARG;
#line 113 "MyTest.xs"
	if (fp != (FILE*) 0) {
		RETVAL = fputs(s, fp);
	}
	else {
		RETVAL = -1;
	}
#line 214 "MyTest.c"
	XSprePUSH; PUSHi((IV)RETVAL);
    }
    XSRETURN(1);
}

SEE ALSO

perlxstut (6)

| 05:20 |  perlxstut (6) - Hackadelic Memo を含むブックマーク はてなブックマーク -  perlxstut (6) - Hackadelic Memo

入力として配列リファレンスを受け付けて、結果として配列リファレンスを返すような XSUB の例。結果の配列リファレンスにはハッシュリファレンスも含まれてる。

MyTest.xs にて、

SV *multi_statfs(paths)
	SV *paths
INIT:
	AV *results;
	I32 numpaths = 0;
	int i, n;
	struct statfs buf;
	
	if ((!SvROK(paths)) 
		|| (SvTYPE(SvRV(paths)) != SVt_PVAV) 
		|| ((numpaths = av_len((AV *)SvRV(paths))) < 0))
	{
		XSRETURN_UNDEF;
	}
	results = (AV *)sv_2mortal((SV *)newAV());
CODE:
	for (n = 0; n <= numpaths; n++) {
		HV *rh;
		STRLEN l;
		char *fn = SvPV(*av_fetch((AV *)SvRV(paths), n, 0), l);

		i = statfs(fn, &buf);
		if (i != 0) {
			av_push(results, newSVnv(errno));
			continue;
		}

		rh = (HV *)sv_2mortal((SV *)newHV());

		hv_store(rh, "f_bavail", 8, newSVnv(buf.f_bavail), 0);
		hv_store(rh, "f_bfree",  7, newSVnv(buf.f_bfree),  0);
		hv_store(rh, "f_blocks", 8, newSVnv(buf.f_blocks), 0);
		hv_store(rh, "f_bsize",  7, newSVnv(buf.f_bsize),  0);
		hv_store(rh, "f_ffree",  7, newSVnv(buf.f_ffree),  0);
		hv_store(rh, "f_files",  7, newSVnv(buf.f_files),  0);
		hv_store(rh, "f_type",   6, newSVnv(buf.f_type),   0);

		av_push(results, newRV((SV *)rh));
	}
	
	RETVAL = newRV((SV *)results);
OUTPUT:
	RETVAL

さらにテスト追加、t/04-multi_statfs.t

use Test::More;
use MyTest;

plan tests => 2;

my $results = MyTest::multi_statfs([ '/', '/blech' ]);

note(explain($results));

ok(ref $results->[0]);
ok(!ref $results->[1]);

make 後に

$ prove -lvcb --timer t/04-multi_statsfs.t
[04:47:06] t/04-multi_statsfs....
1..2
# [
#   {
#     'f_bavail' => '322951',
#     'f_bfree' => '375363',
#     'f_blocks' => '1015393',
#     'f_bsize' => '4096',
#     'f_ffree' => '942132',
#     'f_files' => '1048576',
#     'f_type' => '61267'
#   },
#   '2'
# ]
ok 1
ok 2
ok       22 ms
[04:47:06]
All tests successful.
Files=1, Tests=2,  0 wallclock secs ( 0.03 usr  0.05 sys +  0.01 cusr  0.04 csys =  0.13 CPU)
Result: PASS

さて、もう呪文にしか見えない訳だwww

前の例だと XPUSH* によって戻り値を自前で作ってたけど、今回の XSUB は perl で言えば、

sub multi_statfs($) {
  my $paths = shift;
  my $results;
  my $numpaths = 0;
  my ($i, $n);
  my %buf;

  if (!ref $paths || ref $paths ne "ARRAY" || ($numpaths = scalar(@$paths)) == 0) {
    return;
  }

  $results = [];

  for ($n = 0; $n <= $numpaths; $n++) {
    my $fn = $paths->[$n];
    $i = statfs($fn, \%buf);
    if ($i != 0) {
      push(@$results, $errno);
      next;
    }
    my $rh = +{};
    $rh->{f_bevail} = $buf{f_bevail};
    $rh->{f_bfree}  = $buf{f_bfree};
    $rh->{f_blocks} = $buf{f_blocks};
    $rh->{f_bsize}  = $buf{f_bsize};
    $rh->{f_ffree}  = $buf{f_ffree};
    $rh->{f_files}  = $buf{f_files};
    $rh->{f_type}   = $buf{f_type};

    push(@$results, $rh);
  }

  return $results;
}

みたいな感じか。statfs() ってのはでたらめだけどw

  • SvROK : リファレンスかどうか
  • SvRV : デリファレンス
  • SvTYPE : 型を調べる
  • av_len : 配列が空の場合 -1 を返す
  • XSRETURN_UNDEF : 未定義値を戻り値にするマクロ
  • av_fetch : 配列から値を取り出す $arr[4] とかそういうの
  • av_push : push(@arr, $val) みたいの
  • av_extend(results, numpaths) は事前に配列のサイズを定義しておく
  • hv_store : ハッシュに値を定義する $rh->{$key} = $val; と同じ
  • newRV() リファレンスを新たに作る
    • AV*, HV*, SV* などに多くの場合キャストできる
  • SvRV() は常に SV* を返すので SvTYPE で型を調べて適切な型にキャストする

ふぅー。なるほど。

perlxstut (5)

| 04:27 |  perlxstut (5) - Hackadelic Memo を含むブックマーク はてなブックマーク -  perlxstut (5) - Hackadelic Memo

今度は、複数の値を返す XSUB を作るの巻。#include <XSUB.h> の直後に #include <sys/vfs.h> をしておいて、

void statfs(path)
	char *path
INIT:
	int i;
	struct statfs buf;
PPCODE:
	i = statfs(path, &buf);
	if (i == 0) {
		XPUSHs(sv_2mortal(newSVnv(buf.f_bavail)));
		XPUSHs(sv_2mortal(newSVnv(buf.f_bfree)));
		XPUSHs(sv_2mortal(newSVnv(buf.f_blocks)));
		XPUSHs(sv_2mortal(newSVnv(buf.f_bsize)));
		XPUSHs(sv_2mortal(newSVnv(buf.f_ffree)));
		XPUSHs(sv_2mortal(newSVnv(buf.f_files)));
		XPUSHs(sv_2mortal(newSVnv(buf.f_type)));
	}
	else {
		XPUSHs(sv_2mortal(newSVnv(errno)));
	}

んでもってテストは、

use Test::More;
use MyTest;

plan tests => 2;

{
    my @ret = MyTest::statfs('/foo/bar/baz/test');
    note(explain(\@ret));
    ok(scalar(@ret) == 1 && $ret[0] == 2);
}

{
    my @ret = MyTest::statfs('/');
    note(explain(\@ret));
    ok(scalar(@ret) == 7);
}

とかにしておく。まぁ今回はテストは重要じゃない。

INIT:, PPCODE: と言う新しいブロックが登場した。

The INIT: directive contains code that will be placed immediately after the argument stack is decoded. C does not allow variable declarations at arbitrary locations inside a function, so this is usually the best way to declare local variables needed by the XSUB. (Alternatively, one could put the whole PPCODE: section into braces, and put these declarations on top.) New Things in this Example

で適当に和訳すると、

引数スタックがデコードされた直後に置かれるディレクティブだと。C言語は関数内部の任意の場所に変数宣言することを許可していないので、XSUB によって必要とされるローカル変数宣言の最良の方法として使える。(別の方法として、ひとつは PPCODE: セクション全体をブレースの中におき、これらの宣言をその先頭に置くと言うものがある)

みたいな感じ。XSUB でローカル変数使いたい場合は INIT: に書くとしとこう。

We do this by using the PPCODE: directive, rather than the CODE: directive. This tells xsubpp that we will be managing the return values that will be put on the argument stack by ourselves. New Things in this Example

CODE: の代わりに PPCODE: を使うのは xsubpp に対して引数スタックを自分で作って戻り値を返す為と。

後は引数スタックに自前で突っ込む際には XPUSH* マクロを使う。

XPUSH* マクロは引数スタックを自動的に拡張してくれる。

XPUSHs を使ってるけど事前に EXTEND(SP, 7) とかしとくと PUSHs を使えるそうだ。こっちの方が速いらしい。

ちなみに出来上がった MyTest.c の当該部分。

XS(XS_MyTest_statfs); /* prototype to pass -Wmissing-prototypes */
XS(XS_MyTest_statfs)
{
    dXSARGS;
    if (items != 1)
	Perl_croak(aTHX_ "Usage: MyTest::statfs(path)");
    SP -= items;
    {
	char *	path = (char *)SvPV_nolen(ST(0));
#line 37 "MyTest.xs"
	int i;
	struct statfs buf;
#line 90 "MyTest.c"
#line 40 "MyTest.xs"
	i = statfs(path, &buf);
	if (i == 0) {
		XPUSHs(sv_2mortal(newSVnv(buf.f_bavail)));
		XPUSHs(sv_2mortal(newSVnv(buf.f_bfree)));
		XPUSHs(sv_2mortal(newSVnv(buf.f_blocks)));
		XPUSHs(sv_2mortal(newSVnv(buf.f_bsize)));
		XPUSHs(sv_2mortal(newSVnv(buf.f_ffree)));
		XPUSHs(sv_2mortal(newSVnv(buf.f_files)));
		XPUSHs(sv_2mortal(newSVnv(buf.f_type)));
	}
	else {
		XPUSHs(sv_2mortal(newSVnv(errno)));
	}
#line 105 "MyTest.c"
	PUTBACK;
	return;
    }
}

INIT: ブロックは確かに引数の展開直後にあって、return は空になってる。

perlxstut (4)

| 01:16 |  perlxstut (4) - Hackadelic Memo を含むブックマーク はてなブックマーク -  perlxstut (4) - Hackadelic Memo

今度は MyTest2 と言う物を作って mylib に自分の shared library を作って、それの wrapper を書くという話。

最初に

$ cd /path/to/dir
$ mkdir -p MyTest2
$ mkdir -p MyTest2/mylib
$ cd MyTest2

してあげてから、

./mylib/mylib.h
#define TESTVAL 4

extern double foo(int, long, const char*);
./mylib/mylib.c
#include <stdlib.h>
#include "./mylib.h"

double foo(int a, long b, const char *c) {
	return (a + b + atof(c) + TESTVAL);
}
./mylib/Makefile.PL
use ExtUtils::MakeMaker;

our $Verbose = 1;

WriteMakefile(
    NAME  => 'MyTest2::mylib',
    SKIP  => [qw(all static static_lib dynamic dynamic_lib)],
    clean => {'FILES' => 'libmylib$(LIB_EXT)'},
);

sub MY::top_targets {
		return << 'Makefile';
all :: static

pure_all :: static

static :: libmylib$(LIB_EXT)

libmylib$(LIB_EXT): $(O_FILES)
		$(AR) cr libmylib$(LIB_EXT) $(O_FILES)
		$(RANLIB) libmylib$(LIB_EXT)
Makefile
}

次に wrapper を作る

さっきのディレクトリに居るとして、

$ cd ../
$ h2xs -O -n MyTest2 ./MyTest2/mylib/mylib.h
$ cd MyTest2

としてやると xs の雛形が出来ます。

Makefile.PL
use ExtUtils::MakeMaker;
# See lib/ExtUtils/MakeMaker.pm for details of how to influence
# the contents of the Makefile that is written.
WriteMakefile(
    NAME             => 'MyTest2',
    VERSION_FROM     => 'lib/MyTest2.pm', # finds $VERSION
    PREREQ_PM        => {}, # e.g., Module::Name => 1.1
    ($] >= 5.005 ?     ## Add these new keywords supported since 5.005
      (ABSTRACT_FROM => 'lib/MyTest2.pm', # retrieve abstract from module
       AUTHOR        => 'U-TRYMCH-T60\toru.yamaguchi <toru.yamaguchi@x-ray.at>') : ()),
    LIBS             => [''], # e.g., '-lm'
    DEFINE           => '', # e.g., '-DHAVE_SOMETHING'
    INC              => '-I.', # e.g., '-I. -I/usr/include/other'
    # Un-comment this if you add C files to link with later:
    # OBJECT         => '$(O_FILES)', # link all the C files too
    MYEXTLIB         => 'mylib/libmylib$(LIB_EXT)',
);

if (eval {require ExtUtils::Constant; 1}) {
    # If you edit these definitions to change the constants used by this module,
    # you will need to use the generated const-c.inc and const-xs.inc
    # files to replace their "fallback" counterparts before distributing your
    # changes.
    my @names = (qw(TESTVAL));
    ExtUtils::Constant::WriteConstants(
        NAME         => 'MyTest2',
        NAMES        => \@names,
        DEFAULT_TYPE => 'IV',
        C_FILE       => 'const-c.inc',
        XS_FILE      => 'const-xs.inc',
    );
}
else {
    use File::Copy;
    use File::Spec;
    foreach my $file ('const-c.inc', 'const-xs.inc') {
        my $fallback = File::Spec->catfile('fallback', $file);
        copy ($fallback, $file) or die "Can't copy $fallback to $file: $!";
    }
}

sub MY::postamble {
    return << 'Makefile';
$(MYEXTLIB): mylib/Makefile
	cd mylib && $(MAKE) $(PASSTHRU)
Makefile
}

修正内容は、

  • WriteMakefile() の MYEXTLIB の設定
  • sub MY::postamble の定義

です。

lib/MyTest2.pm

ここで @EXPORT にある TESTVAL を @EXPORT_OK に移す。

our @EXPORT_OK = ( 
    @{ $EXPORT_TAGS{'all'} },
    'TESTVAL',
);

our @EXPORT = qw(
);
MyTest2.xs

ヘッダのパス修正と foo(a,b,c) の追加

#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "ppport.h"

#include <./mylib/mylib.h>

#include "const-c.inc"

MODULE = MyTest2		PACKAGE = MyTest2		

INCLUDE: const-xs.inc

double foo(a,b,c)
	int        a
	long       b
	const char *c
OUTPUT:
	RETVAL
t/*.t

テストは次のようにした。

use Test::More;
use MyTest2;

plan tests => 3;

is(MyTest2::foo(1, 2, "Hello, world!"), 7);
is(MyTest2::foo(1, 2, "0.0"), 7);
ok(abs(MyTest2::foo(0, 0, "-3.4") - 0.6) <= 0.01);

さて make してみる

typemap に const char* T_PV が無いって言ってるけど 5.8 では既に定義済みなので、この点はスルーする。

また MANIFEST がおかしいので、rm MANIFEST して perl Makefile.PL && make manifest とかで。

make distclean して再び、perl Makefile.PL して make, make test をやる。

出来上がった MyTest2.c を見る

foo() の部分はこんな感じ。

XS(XS_MyTest2_foo); /* prototype to pass -Wmissing-prototypes */
XS(XS_MyTest2_foo)
{
    dXSARGS;
    if (items != 3)
	Perl_croak(aTHX_ "Usage: MyTest2::foo(a, b, c)");
    {
	int	a = (int)SvIV(ST(0));
	long	b = (long)SvIV(ST(1));
	const char *	c = (const char *)SvPV_nolen(ST(2));
	double	RETVAL;
	dXSTARG;

	RETVAL = foo(a, b, c);
	XSprePUSH; PUSHn((double)RETVAL);
    }
    XSRETURN(1);
}

RETVAL が暗黙のうちに定義されてるのが分かる。

一方で、:CODE を定義してあげて、

double foo(a, b, c)
	int        a
	long       b
	const char *c
CODE:
	RETVAL = foo(a, b, c);
OUTPUT:
	RETVAL

として make してから再び MyTest2.c を見ると、

XS(XS_MyTest2_foo); /* prototype to pass -Wmissing-prototypes */
XS(XS_MyTest2_foo)
{
    dXSARGS;
    if (items != 3)
	Perl_croak(aTHX_ "Usage: MyTest2::foo(a, b, c)");
    {
	int	a = (int)SvIV(ST(0));
	long	b = (long)SvIV(ST(1));
	const char *	c = (const char *)SvPV_nolen(ST(2));
	double	RETVAL;
	dXSTARG;
#line 20 "MyTest2.xs"
	RETVAL = foo(a, b, c);
#line 144 "MyTest2.c"
	XSprePUSH; PUSHn((double)RETVAL);
    }
    XSRETURN(1);
}

行番号を示すコメントが追加されただけで、同じ内容になってるのが分かる。

ちなみに :OUTPUT セクションも削除出来て、最終的には

double foo(a, b, c)
	int        a
	long       b
	const char *c

だけで済む。すばらしい!

MyTest のときの is_even について

上記の議論によって、

#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "ppport.h"

#define is_even(arg) ((arg) % 2 == 0)

MODULE = MyTest		PACKAGE = MyTest

のように is_even をマクロにして、

int is_even(input)
	int input

としてやっても同じように動き、MyTest.c は

XS(XS_MyTest_is_even); /* prototype to pass -Wmissing-prototypes */
XS(XS_MyTest_is_even)
{
    dXSARGS;
    if (items != 1)
	Perl_croak(aTHX_ "Usage: MyTest::is_even(input)");
    {
	int	input = (int)SvIV(ST(0));
	int	RETVAL;
	dXSTARG;
#line 16 "MyTest.xs"
	RETVAL = (input % 2 == 0) ? 1 : 0;
#line 46 "MyTest.c"
	XSprePUSH; PUSHi((IV)RETVAL);
    }
    XSRETURN(1);
}

だったのが、

XS(XS_MyTest_is_even); /* prototype to pass -Wmissing-prototypes */
XS(XS_MyTest_is_even)
{
    dXSARGS;
    if (items != 1)
	Perl_croak(aTHX_ "Usage: MyTest::is_even(input)");
    {
	int	input = (int)SvIV(ST(0));
	int	RETVAL;
	dXSTARG;

	RETVAL = is_even(input);
	XSprePUSH; PUSHi((IV)RETVAL);
    }
    XSRETURN(1);
}

のようになる。is_even はもちろんマクロ。

まとめ

typemap 最強って事ですね。あと xs ファイルにコードその物を書くより、外に出した方がよっぽどすっきりするって事ですな。

MikhaielMikhaiel2013/03/23 23:26That hits the target prefcetly. Thanks!

fzswxdqtyfzswxdqty2013/03/24 13:55EqRzEb <a href="http://cokxuzuwwitw.com/">cokxuzuwwitw</a>

mgeujgjsvmgeujgjsv2013/03/26 08:52B7FuNu , [url=http://nzrlngxsncsv.com/]nzrlngxsncsv[/url], [link=http://ueykjueabdlu.com/]ueykjueabdlu[/link], http://spgsjdcxggpu.com/

fvckyaicphsfvckyaicphs2013/03/26 08:52Yrm6T3 , [url=http://vkqcgujiafdr.com/]vkqcgujiafdr[/url], [link=http://wsiffyvwexpd.com/]wsiffyvwexpd[/link], http://wowitnrximhv.com/

EveRaniEveRani2018/01/26 13:30Cialis Meglio Del Viagra Viagra E Cialis Insieme Canadian Pharmacy Without Perscription <a href=http://cialiorder.com>cialis</a> Difference Cialis Et Viagra Kamagra 100 Mg Priligy 30 O 60 Mg

RobertVefRobertVef2018/07/27 07:32<a href="http://craigyoe.com/#100mg">cost of 100 mg viagra</a> discount viagra without perscription
<a href="http://craigyoe.com/#buy-viagra">viagra 100 mg vs 50 mg</a> buy viagra without consultation
<a href=http://craigyoe.com/#buy>viagra 100 mg vs 50 mg</a> buy viagra without a prescription
http://craigyoe.com/#100mg buy viagra without a prescription

HyrvrktVefHyrvrktVef2018/07/28 20:02<a href="http://cliziagussoni.com/#cheap">Buy cheap cialis online</a> buy real viagra online without prescription
viagra without consultation uk poland viagra without prescription <a href="http://cliziagussoni.com/#buy-cialis">buy cialis</a>
buy viagra online without prescription <a href=http://cliziagussoni.com/#cheap>Buy cheap cialis online</a>
viagra without prescription usa http://cliziagussoni.com/

RobertVefRobertVef2018/07/28 20:38<a href="http://craigyoe.com/#buy-viagra">viagra 100 mg vs 50 mg</a> free trial viagra without prescriptions
<a href="http://craigyoe.com/#viagra">viagra pills 100 mg</a> buy viagra without consultation
<a href=http://craigyoe.com/#viagra>cost of 100 mg viagra</a> super viagra without prescriptions
http://craigyoe.com/#viagra online prescription viagra without

HyrvrktVefHyrvrktVef2018/07/29 04:18<a href="http://cliziagussoni.com/#buy-cialis">buy cialis</a> buy viagra online without prescription
buy viagra online without script free viagra without prescription <a href="http://cliziagussoni.com/#cialis">cheap cialis</a>
buy viagra without a prescription <a href=http://cliziagussoni.com/#buy>Buy cheap cialis online</a>
viagra without seeing a doctor http://cliziagussoni.com/#cialis

RobertVefRobertVef2018/07/29 13:14<a href="http://craigyoe.com/#100mg">100 mg viagra street price</a> free viagra sample without doctor
<a href="http://craigyoe.com/#buy">100 mg viagra street cost</a> generic viagra without a prescription
<a href=http://craigyoe.com/#viagra>cost of 100 mg viagra</a> canada pharmacy viagra without script
http://craigyoe.com/#viagra viagra without credit card

RobertVefRobertVef2018/07/29 20:57<a href="http://craigyoe.com/#buy-viagra">viagra pills 100 mg</a> viagra without script
<a href="http://craigyoe.com">viagra pills 100 mg</a> viagra online without persciption
<a href=http://craigyoe.com/#100mg>100 mg viagra street price</a> viagra without prescription.
http://craigyoe.com/#buy buy viagra online without script

HyrvrktVefHyrvrktVef2018/07/30 04:24<a href="http://cliziagussoni.com/">Buy cheap cialis</a> viagra without script
super viagra without prescriptions viagra purchase without perscription us pharmacy <a href="http://cliziagussoni.com/#cheap-cialis">cheap cialis</a>
canada pharmacy viagra without script <a href=http://cliziagussoni.com/>cheap cialis</a>
buy generic viagra online without prescription http://cliziagussoni.com/#cheap-cialis

RurvrktVefRurvrktVef2018/07/31 01:02<a href="http://cialistlm.com">Buy Cheap Cialis Online</a> original viagra without prescription <a href="http://cialisfurr.com/#cialis">Buy Cialis</a> buy real viagra online without prescription
<a href=http://cialistlm.com>Buy Cheap Cialis Online</a> prescription viagra without
http://xcialisxx.com/#buy-cialis purchase viagra without prescription

HobertVefHobertVef2018/07/31 01:47<a href="http://xcialisxx.com/#buy-cialis">Buy Cialis</a> free viagra sample without doctor <a href="http://cialisfurr.com/#cialis">buy cialis without prescription</a> purchase viagra without prescription
<a href=http://cialistlm.com/#cheap>Cheap Cialis Online</a> viagra without prescription
http://cialistlm.com buy viagra online without

HobertVefHobertVef2018/07/31 10:49<a href="http://xcialisxx.com">Buy Cheap Cialis Online</a> viagra online without prescriptions <a href="http://cialisfurr.com">buy cialis without prescription</a> viagra without see a doctor
<a href=http://cialisfurr.com>Buy Cialis 20 mg</a> viagra online without rx
http://cialistlm.com/#cheap buy link viagra without

HobertVefHobertVef2018/07/31 21:06<a href="http://cialistlm.com">Cheap Cialis Online</a> viagra plus without prescription <a href="http://xcialisxx.com">Buy Cheap Cialis Online</a> cheap viagra without subscription
<a href=http://cialisfurr.com>Buy Cialis</a> viagra without a prescription in usa
http://cialisfurr.com/#cialis taking viagra without erectile dysfunction

RurvrktVefRurvrktVef2018/08/03 06:41<a href="http://cialisfurr.com/#cialis">Buy Cialis 20 mg</a> buy viagra without prescriptions uk <a href="http://cialistlm.com">Buy Cheap Cialis</a> prescription order viagra without
<a href=http://cialistlm.com/#cheap>Cheap Cialis Online</a> viagra prescription without
http://cialisfurr.com buy viagra without prescription online

HobertVefHobertVef2018/08/03 07:24<a href="http://cialisfurr.com">buy cialis without prescription</a> taking viagra without erectile dysfunction <a href="http://xcialisxx.com/#buy-cialis">Cialis online</a> buy viagra without a prescription
<a href=http://cialisfurr.com>Buy Cialis Online</a> canada rx viagra without prescription
http://cialistlm.com viagra without prescription in the usa

RurvrktVefRurvrktVef2018/08/03 15:16<a href="http://cialistlm.com">Buy Cheap Cialis</a> free viagra without prescription <a href="http://cialistlm.com/#cheap">Buy Cheap Cialis Online</a> viagra without a rx
<a href=http://cialistlm.com>Buy Cheap Cialis Online</a> without a prescription brand viagra
http://cialisfurr.com real viagra online without prescription

HobertVefHobertVef2018/08/03 15:58<a href="http://cialistlm.com">Cheap Cialis Online</a> buying viagra without prescription <a href="http://cialisfurr.com/#cialis">buy cialis without prescription</a> viagra without perscription
<a href=http://cialisfurr.com>Buy Cialis</a> buying viagra without prescription
http://xcialisxx.com viagra without a prescription ontario

HobertVefHobertVef2018/08/04 00:23<a href="http://xcialisxx.com">Buy Cheap Cialis Online</a> viagra without a prescription <a href="http://cialisfurr.com">Buy Cialis 20 mg</a> buy viagra without a prescription
<a href=http://cialistlm.com/#cheap>Cheap Cialis Online</a> buy generic viagra online without prescription
http://cialisfurr.com/#cialis viagra 100mg price without rx

RurvrktVefRurvrktVef2018/08/04 08:21<a href="http://cialistlm.com/#cheap">Cheap Cialis</a> generic viagra without prescription <a href="http://cialisfurr.com/#cialis">Buy Cialis Online</a> viagra without a prescription ontario canada
<a href=http://cialisfurr.com>Buy Cialis 20 mg</a> buy real viagra online without prescription
http://xcialisxx.com/#buy-cialis buy viagra without prescription

RurvrktVefRurvrktVef2018/08/04 16:38<a href="http://cialisfurr.com">Buy Cialis 20 mg</a> buy viagra online without <a href="http://cialisfurr.com">Buy Cialis Online</a> instant viagrawithoutprescription
<a href=http://cialistlm.com/#cheap>Cheap Cialis Online</a> viagra without rx
http://xcialisxx.com viagra without a prescription in usa

HobertVefHobertVef2018/08/04 21:39<a href="http://xcialisxx.com/#buy-cialis">Buy Cialis</a> buy viagra without prescription' <a href="http://cialisfurr.com/#cialis">buy cialis without prescription</a> get viagra without prescription
<a href=http://cialistlm.com/#cheap>Buy Cheap Cialis Online</a> viagra without subscription fast
http://xcialisxx.com viagra without prescriptions usa

RurvrktVefRurvrktVef2018/08/05 00:54<a href="http://xcialisxx.com">Buy Cialis Online</a> buy viagra online without rx <a href="http://xcialisxx.com">Buy Cialis Online</a> viagra without prescrip
<a href=http://cialisfurr.com/#cialis>buy cialis without prescription</a> viagra without a prescription usa
http://cialisfurr.com viagra usa without a prescription

HobertVefHobertVef2018/08/05 06:43<a href="http://xcialisxx.com/#buy-cialis">Cialis online</a> viagra without prescription usa <a href="http://cialistlm.com">Buy Cheap Cialis</a> order viagra without prescription
<a href=http://cialistlm.com>Buy Cheap Cialis Online</a> viagra without a doctors prescription
http://cialisfurr.com/#cialis viagra online without perscription

RurvrktVefRurvrktVef2018/08/05 09:38<a href="http://cialisfurr.com/#cialis">buy cialis without prescription</a> viagraprofessionalwithoutaprescription <a href="http://xcialisxx.com">Buy Cheap Cialis Online</a> buying viagra without prescription
<a href=http://cialisfurr.com>Buy Cialis Online</a> viagra without prescription.
http://xcialisxx.com generic viagra without rx

HobertVefHobertVef2018/08/05 15:26<a href="http://cialisfurr.com/#cialis">Buy Cialis Online</a> buy viagra without a prescription <a href="http://cialisfurr.com/#cialis">Buy Cialis Online</a> cheap viagra without a pr
<a href=http://cialistlm.com/#cheap>Cheap Cialis Online</a> viagra online without prescription uk
http://cialisfurr.com/#cialis viagra without a prescription usa

RurvrktVefRurvrktVef2018/08/05 18:04<a href="http://cialistlm.com/#cheap">Cheap Cialis</a> cheap viagra without a pr <a href="http://cialisfurr.com">buy cialis without prescription</a> low cost viagra without perscription
<a href=http://cialistlm.com>Cheap Cialis</a> cheap viagra without script
http://cialistlm.com buy viagra online without

HobertVefHobertVef2018/08/06 00:10<a href="http://xcialisxx.com">Buy Cialis</a> viagra without a script <a href="http://xcialisxx.com/#buy-cialis">Buy Cialis</a> viagra without prescription australia
<a href=http://xcialisxx.com/#buy-cialis>Buy Cheap Cialis Online</a> buy viagra online without a credit card
http://xcialisxx.com best viagra without. prescription

RurvrktVefRurvrktVef2018/08/06 02:44<a href="http://xcialisxx.com/#buy-cialis">Buy Cheap Cialis Online</a> buy viagra online without <a href="http://cialisfurr.com/#cialis">Buy Cialis Online</a> viagra without a prescription ontario
<a href=http://cialistlm.com>Cheap Cialis</a> generic viagra without perception
http://xcialisxx.com/#buy-cialis ordering viagra without prescription

HobertVefHobertVef2018/08/06 09:18<a href="http://xcialisxx.com">Cialis online</a> obtaining viagra without prescription <a href="http://cialisfurr.com/#cialis">Buy Cialis 20 mg</a> viagrawithout a prescription
<a href=http://cialisfurr.com>Buy Cialis Online</a> order viagra 100 mg without
http://cialisfurr.com buying viagra without a prescription

トラックバック - http://zigorou.g.hatena.ne.jp/ZIGOROu/20090322

2009-03-21

perlxstut (3)

| 02:45 |  perlxstut (3) - Hackadelic Memo を含むブックマーク はてなブックマーク -  perlxstut (3) - Hackadelic Memo

void round(arg)
	 double arg;
CODE:
	 if (arg > 0.0)
		 arg = floor(arg + 0.5);
	 else if (arg < 0.0)
		 arg = ceil(arg - 0.5);
	 else
		 arg = 0.0;
OUTPUT:
	 arg

ところで、floor(3), ceil(3) は -lm しないとダメと man にも書いてあるから、Makefile.PL にて、LIBS に -lm を加えておく。

use strict;
use warnings;

use Test::More;
use Test::Exception;

use MyTest;

my @test_cases = (
    +{ input => -1.5, expected => -2.0 },
    +{ input => -1.1, expected => -1.0 },
    +{ input => 0.0, expected => 0.0 },
    +{ input => 0.5, expected => 1.0 },
    +{ input => 1.2, expected => 1.0 },
);

plan tests => scalar(@test_cases) + 1;

for my $tc (@test_cases) {
    my $input = $tc->{input};
    MyTest::round($input);

    is(
        $input, 
        $tc->{expected}, 
        sprintf("round(%02.2f) is %02.2f", $tc->{input} || 0.0, $tc->{expected} || 0.0)
    );
}

dies_ok(sub { MyTest::round(3); }, 'cannot accept const val');

こんな感じでテストする。

perlxstut (2)

| 02:16 |  perlxstut (2) - Hackadelic Memo を含むブックマーク はてなブックマーク -  perlxstut (2) - Hackadelic Memo

さっきと違うのは xs に is_even って言う関数を追加したって所。

int
is_even(input)
	int input
CODE:
	RETVAL = (input % 2 == 0);
OUTPUT:
	RETVAL

まぁこれはいい。

use Test::More;

plan tests => 4;

use MyTest;

for (0..3) {
    my $is_even = $_ % 2 == 0 ? 1 : 0;
    is(MyTest::is_even($_), $is_even, sprintf("%d is %s", $_, $is_even ? "even" : "odd"));
}

make, make test でテスト実行。

perlxstut (1)

| 02:06 |  perlxstut (1) - Hackadelic Memo を含むブックマーク はてなブックマーク -  perlxstut (1) - Hackadelic Memo

まず始め

$ mkdir /path/to
$ h2xs -A -n Mytest
$ cd Mytest

Makefile.PL の編集

use ExtUtils::MakeMaker;
# See lib/ExtUtils/MakeMaker.pm for details of how to influence
# the contents of the Makefile that is written.
WriteMakefile(
    NAME              => 'Mytest',
    VERSION_FROM      => 'lib/Mytest.pm', # finds $VERSION
    PREREQ_PM         => {}, # e.g., Module::Name => 1.1
    ($] >= 5.005 ?     ## Add these new keywords supported since 5.005
      (ABSTRACT_FROM  => 'lib/Mytest.pm', # retrieve abstract from module
       AUTHOR         => 'U-TRYMCH-T60\toru.yamaguchi <toru.yamaguchi@x-ray.at>') : ()),
    LIBS              => [''], # e.g., '-lm'
    DEFINE            => '', # e.g., '-DHAVE_SOMETHING'
    INC               => '-I.', # e.g., '-I. -I/usr/include/other'
	# Un-comment this if you add C files to link with later:
    # OBJECT            => '$(O_FILES)', # link all the C files too
);

use version な記述を削除しただけ。

lib/Mytest.pm の編集

package Mytest;

use strict;
use warnings;

require Exporter;

our @ISA = qw(Exporter);

# Items to export into callers namespace by default. Note: do not export
# names by default without a very good reason. Use EXPORT_OK instead.
# Do not simply export all your public functions/methods/constants.

# This allows declaration	use Mytest ':all';
# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
# will save memory.
our %EXPORT_TAGS = ( 'all' => [ qw(
	
) ] );

our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );

our @EXPORT = qw(
	
);

our $VERSION = '0.01';

require XSLoader;
XSLoader::load('Mytest', $VERSION);

# Preloaded methods go here.

1;

use version な記述を削除しただけ。

Mytest.xs

#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "ppport.h"

MODULE = Mytest		PACKAGE = Mytest

void
hello()
	CODE:
		printf("Hello, world\n");

make して実行

$ perl Makefile.PL
$ make 
$ perl -MExtUtils::testlib -MMytest -e 'Mytest::hello()'
Hello, world

なるほど。

SEE ALSO

4.3 umask 関数の使用例

| 01:49 |  4.3 umask 関数の使用例 - Hackadelic Memo を含むブックマーク はてなブックマーク -  4.3 umask 関数の使用例 - Hackadelic Memo

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define ERR_MSG_LENGTH 256

int main(int argc, char *argv[]) {
	umask(0);

	if (creat("foo", S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH ) < 0)
		perror("creat error for foo");

	umask(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);

	if (creat("bar", S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH ) < 0)
		perror("creat error for bar");

	exit(0);
}

ファイル作成時のパーミッションをコントロールするのが umask(2)

実際このプログラムを走らせると、

-rw-------  1 zigorou adm      0 Mar 18 03:39 bar
-rw-rw-rw-  1 zigorou adm      0 Mar 18 03:39 foo

となる。

$ perl -le 'printf("0%lo", 0666 ^ 0000)'
0666
$ perl -le 'printf("0%lo", 0666 ^ 0022)'
0644

とかで umask の意味が分かる。

4.2 access 関数の使用例

| 01:25 |  4.2 access 関数の使用例 - Hackadelic Memo を含むブックマーク はてなブックマーク -  4.2 access 関数の使用例 - Hackadelic Memo

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>

#define ERR_MSG_LENGTH 256

int main(int argc, char *argv[]) {
	char err_msg[ERR_MSG_LENGTH];

	if (argc != 2) {
		perror("usage: a.out <pathname>");
		exit(1);
	}

	if (access(argv[1], R_OK) < 0) {
		snprintf(err_msg, ERR_MSG_LENGTH, "access error for %s", argv[1]);
		perror(err_msg);
		exit(2);
	}
	else
		printf("read access OK\n");

	if (open(argv[1], O_RDONLY) < 0) {
		snprintf(err_msg, ERR_MSG_LENGTH, "open error for %s", argv[1]);
		perror(err_msg);
		exit(3);
	}
	else
		printf("open for reading OK\n");

	exit(0);
}

R_OK, W_OK, X_OK, F_OK マクロは <unistd.h> にて定義されてる。

lumcglfykrlumcglfykr2013/08/28 08:23lwxvr{jhpspv, <a href="http://www.wkscqtbjsp.com/">hxoahwvjnp</a>

obqfltaxxsobqfltaxxs2013/08/28 18:48ezutn{jhpspv, http://www.hsiratnwor.com/ duwqauohym

fznrxcgiqxfznrxcgiqx2013/08/29 02:25bzfdw{jhpspv, <a href="http://www.mqacrfhaaq.com/">emqlynoimh</a> , [url=http://www.rvuwvotmbn.com/]pgtpsiietm[/url], http://www.veusqsffkw.com/ emqlynoimh

yfyuzmfdvuyfyuzmfdvu2013/11/23 07:03riarn{jhpspv, <a href="http://www.dxwwvvsiip.com/">ryawhndxzk</a> , [url=http://www.ripouchnrt.com/]ujqfqmjazk[/url], http://www.vmrfwhhvhm.com/ ryawhndxzk

FrancpoiffFrancpoiff2017/05/09 10:19Clomid By Avents Propecia Espana Online Venta Viagra Generico <a href=http://byuvaigranonile.com>viagra</a> Cialis Plm Real Cialis No Generic Levitra Wann Wirkt

SamuelLutSamuelLut2017/08/30 17:06<a href=http://acheteramoxicilline500enligne.com/>amoxicilline 500 mg gГ©lules</a>
amoxicilline acide clavulanique 500 mg
<a href=" http://acheteramoxicilline500enligne.com/ ">amoxicilline biogaran 500 mg</a>
amoxicilline acide clavulanique biogaran 500 mg 62.5 mg

ColinmupColinmup2017/08/30 17:06<a href=http://acheterclomidenlignefrance.com/>acheter duphaston et clomid</a>
acheter clomid
<a href=" http://acheterclomidenlignefrance.com/ ">acheter du clomid</a>
clomid acheter sur internet

SteventuhSteventuh2017/08/30 17:06<a href=http://sildenafilpfizer50mgprix.com/>sildenafil pfizer 50</a>
sildenafil pfizer 100 mg prix
<a href=" http://sildenafilpfizer50mgprix.com/ ">sildenafil pfizer 50 mg avis</a>
sildenafil pfizer 100 mg avis

ClarkTrebyClarkTreby2017/08/30 17:07<a href=http://sildenafil100mgprixenpharmacieenfrance.com/>sildenafil 100mg</a>
sildenafil citrate 100mg
<a href=" http://sildenafil100mgprixenpharmacieenfrance.com/ ">sildenafil citrate 100mg prix</a>
sildenafil citrate tablets 100mg

JuliuscotJuliuscot2017/08/30 17:07<a href=http://tadalafil20mgpaschereninde.com/>tadalafil 20mg avis</a>
cialis tadalafil 20mg
<a href=" http://tadalafil20mgpaschereninde.com/ ">elevex tadalafil 20mg</a>
commander tadalafil 20mg

RamonHabRamonHab2017/08/30 17:07<a href=http://acheterzithromaxsurinternetenfrance.club/>zithromax monodose sans ordonnance</a>
zithromax sans ordonnance en pharmacie
<a href=" http://acheterzithromaxsurinternetenfrance.club/ ">zithromax monodose sans ordonnance</a>
acheter zithromax monodose sans ordonnance

CharlietramsCharlietrams2017/08/30 17:07<a href=http://acheterpropeciasansordonnance.com/>propecia avis</a>
should i take propecia
<a href=" http://acheterpropeciasansordonnance.com/ ">finasteride or propecia</a>
propecia danger

CharlesFetCharlesFet2017/08/30 17:11<a href=http://vardenafilprixenpharmacieacaen.com/>vardenafil prix en pharmacie</a>
acheter vardenafil generique
<a href=" http://vardenafilprixenpharmacieacaen.com/ ">vardenafil prix</a>
acheter vardenafil

JamesCruchJamesCruch2017/08/30 17:31<a href=http://acheteramoxicillinepascherenfrance.com/>acheter amoxicilline 1g</a>
acheter amoxicilline en ligne
<a href=" http://acheteramoxicillinepascherenfrance.com/ ">acheter amoxicilline acide clavulanique</a>
acheter amoxicilline 1g en ligne

HowardLefHowardLef2017/08/31 11:53<a href=http://viagrahap30.org/>what does female viagra do</a>
female viagra 2015
<a href=" http://viagrahap30.org/ ">female viagra news</a>
female viagra reviews

MichaelsmimeMichaelsmime2017/08/31 12:19<a href=http://viagraning30.org/>viagra com coupon</a>
viagra coupon
<a href=" http://viagraning30.org/ ">viagra coupon 3 free</a>
viagra coupon free trial

JamespluriJamespluri2017/08/31 12:23<a href=http://feheckevent30.org/>cialis vs viagra effectiveness</a>
viagra vs cialis spam
<a href=" http://feheckevent30.org/ ">viagra vs cialis</a>
viagra vs cialis reddit

KennethabuptKennethabupt2017/08/31 12:23<a href=http://howduca30.org/>viagra for sale in canada</a>
real viagra for sale
<a href=" http://howduca30.org/ ">200 mg viagra for sale</a>
uk viagra for sale

BrettMawBrettMaw2017/08/31 12:23<a href=http://viagralac30.org/>generic viagra online</a>
generic viagra
<a href=" http://viagralac30.org/ ">viagra generic name</a>
buy generic viagra online

RalphvonRalphvon2017/08/31 13:40<a href=http://fortperhat30.org/>cialis price comparison</a>
cialis generic best price
<a href=" http://fortperhat30.org/ ">cialis price cvs</a>
cialis price walmart

BriangaimiBriangaimi2017/08/31 14:12<a href=http://viagragot30.org/>buy viagra</a>
best place to buy generic viagra forum
<a href=" http://viagragot30.org/ ">where can i buy viagra</a>
buy generic viagra online usa

LloydsotLloydsot2017/08/31 14:13<a href=http://viagrathen30.org/>herbal viagra that works</a>
herbal substitutes for viagra
<a href=" http://viagrathen30.org/ ">best herbal viagra alternatives</a>
herbal viagra green box

JasonwafJasonwaf2017/08/31 14:30<a href=http://retlehen30.org/>cialis generic 2017</a>
is generic cialis safe
<a href=" http://retlehen30.org/ ">cialis generic date</a>
when will cialis go generic

MelvinteelpMelvinteelp2017/08/31 14:32<a href=http://dintrolha.org/>buy prednisone for dogs</a>
buy prednisone online cheap
<a href=" http://dintrolha.org/ ">where to buy prednisone for dogs</a>
buy prednisone online overnight

DamianjubDamianjub2017/08/31 14:33<a href=http://tertsepa.org/>generic viagra canada</a>
is there a generic for viagra
<a href=" http://tertsepa.org/ ">when does viagra go generic</a>
generic viagra

KennethabuptKennethabupt2017/09/01 12:15<a href=http://howduca30.org/>herb viagra for sale</a>
real viagra for sale
<a href=" http://howduca30.org/ ">viagra tablets for sale</a>
herbal viagra for sale

JasonPhilkJasonPhilk2017/09/01 12:15<a href=http://parlittga30.org/>cialis buy online</a>
buy cialis online without prescription
<a href=" http://parlittga30.org/ ">buy cialis online canada pharmacy</a>
buy cialis online

RalphvonRalphvon2017/09/01 12:16<a href=http://fortperhat30.org/>best price for cialis 20 mg</a>
price of cialis at walgreens
<a href=" http://fortperhat30.org/ ">cialis 5mg best price</a>
price of cialis at walmart

DamianjubDamianjub2017/09/01 12:16<a href=http://tertsepa.org/>generic viagra names</a>
best place to buy generic viagra online
<a href=" http://tertsepa.org/ ">canadian pharmacy generic viagra</a>
generic viagra

MelvinteelpMelvinteelp2017/09/01 12:16<a href=http://dintrolha.org/>prednisone 10mg buy online</a>
buy prednisone for dogs
<a href=" http://dintrolha.org/ ">buy prednisone online for dogs</a>
buy prednisone online overnight

ThomasjewThomasjew2017/09/02 12:31<a href=http://finasterideforsale01.org/>finasteride 1mg for sale</a>
finasteride for sale
<a href=" http://finasterideforsale01.org/ ">finasteride for sale cheap</a>
topical finasteride for sale

JamesLoureJamesLoure2017/09/02 12:31<a href=http://sildenafilcost01.org/>cost of sildenafil</a>
sildenafil 50 mg cost
<a href=" http://sildenafilcost01.org/ ">sildenafil 20 mg cost</a>
how much does sildenafil 20 mg cost

RogerkekRogerkek2017/09/02 21:36<a href=http://purchaseviagra01.org/>can i purchase viagra online</a>
purchase viagra soft tabs
<a href=" http://purchaseviagra01.org/ ">how to purchase viagra</a>
purchase viagra online safely

DavidcoxDavidcox2017/09/02 21:45<a href=http://buyvalacyclovir01.org/>where can i buy valacyclovir</a>
buy valacyclovir
<a href=" http://buyvalacyclovir01.org/ ">buy valacyclovir 1000 mg</a>
buy valacyclovir without prescription

JustingapJustingap2017/09/02 21:49<a href=http://buylisinopril01.org/>buy lisinopril online canada</a>
how to buy lisinopril online
<a href=" http://buylisinopril01.org/ ">buy lisinopril online</a>
buy lisinopril 10 mg

MichaelmipMichaelmip2017/09/02 22:01<a href=http://azithromycincost01.org/>azithromycin cost without insurance</a>
cost of azithromycin without insurance
<a href=" http://azithromycincost01.org/ ">cost of azithromycin 250 mg at walmart</a>
azithromycin cost walmart

HeathBedHeathBed2017/09/02 22:25<a href=http://buypropecia01.org/>buy propecia amazon</a>
buy finasteride propecia
<a href=" http://buypropecia01.org/ ">buy propecia 1mg</a>
buy propecia online

MatthewspupeMatthewspupe2017/09/02 22:25<a href=http://azithromycinforsale01.org/>fish antibiotics azithromycin for sale</a>
fish azithromycin for sale
<a href=" http://azithromycinforsale01.org/ ">azithromycin 500mg tablets for sale</a>
azithromycin 500mg for sale

RichardGuicyRichardGuicy2017/09/02 22:26<a href=http://prednisoloneprice01.org/>prednisone 10mg price</a>
prednisone 20 mg price
<a href=" http://prednisoloneprice01.org/ ">price of prednisone at walmart</a>
prednisone price canada

DavidgalDavidgal2017/09/02 23:21<a href=http://amoxicillinforsale01.org/>amoxicillin for sale in us</a>
amoxicillin 500mg clavulanate potassium for sale in houston tx
<a href=" http://amoxicillinforsale01.org/ ">amoxicillin for sale no presription</a>
amoxicillin 875 mg for sale

MichaelunsenMichaelunsen2017/09/02 23:41<a href=http://cheapsildenafil01.org/>cheap sildenafil citrate</a>
cheap sildenafil citrate 100mg
<a href=" http://cheapsildenafil01.org/ ">cheap sildenafil</a>
buy cheap sildenafil citrate 100mg

JeffreySumJeffreySum2017/09/03 15:17<a href=http://viagraprice02.org/>viagra price</a>
viagra 100mg price walmart
<a href=" http://viagraprice02.org/ ">viagra single packs price</a>
viagra price comparison

StevenopiftStevenopift2017/09/03 16:12<a href=http://purchasecialis02.org/>purchase cialis</a>
cheap cialis online purchase
<a href=" http://purchasecialis02.org/ ">purchase cialis</a>
cialis purchase

JacobZomJacobZom2017/09/03 16:12<a href=http://buymisoprostol02.org/>where can i buy misoprostol</a>
where can i buy misoprostol and mifepristone
<a href=" http://buymisoprostol02.org/ ">where can i buy misoprostol</a>
buy misoprostol

ScottvobreScottvobre2017/09/03 16:16<a href=http://prednisonecost02.org/>prednisone for dogs cost</a>
how much does prednisone cost at walgreens
<a href=" http://prednisonecost02.org/ ">cost of prednisone</a>
prednisone eye drops cost

HowardbetHowardbet2017/09/03 16:16<a href=http://metforminsale02.org/>metformin for sale canada</a>
metformin tablets for sale
<a href=" http://metforminsale02.org/ ">metformin dosage on counter for sale</a>
metformin dosage on counter for sale

RaymondMeantRaymondMeant2017/09/03 16:17<a href=http://cheapcialis02.org/>cheap cialis</a>
cheap cialis
<a href=" http://cheapcialis02.org/ ">cheap cialis pills</a>
cheap generic cialis 60 mg

RobertFeedeRobertFeede2017/09/03 16:17<a href=http://nolvadexforsale02.org/>nolvadex pills for sale</a>
liquid nolvadex for sale
<a href=" http://nolvadexforsale02.org/ ">nolvadex and clomid for sale</a>
nolvadex for sale in usa

PeternarcePeternarce2017/09/03 16:17<a href=http://valtrexprice02.org/>price of valtrex at walmart</a>
valtrex price without insurance
<a href=" http://valtrexprice02.org/ ">valtrex 500mg price</a>
valtrex 1 gram price

RobertowoorpRobertowoorp2017/09/03 16:17<a href=http://amoxicillinprice02.org/>amoxicillin price cvs</a>
amoxicillin clavulanic acid price
<a href=" http://amoxicillinprice02.org/ ">amoxicillin price cvs</a>
amoxicillin 875 mg price

KevinreilmKevinreilm2017/09/03 16:20<a href=http://buysertraline02.org/>buy sertraline</a>
how can i buy sertraline without a prescription
<a href=" http://buysertraline02.org/ ">buy sertraline without prescription</a>
can you buy sertraline over the counter

RichardLapRichardLap2017/09/05 09:39<a href=http://viagraforsale04.com/>viagra pills for sale</a>
generic viagra for sale
<a href=" http://viagraforsale04.com/ ">viagra for sale on ebay</a>
viagra for sale online

WinfredskeneWinfredskene2017/09/05 09:45<a href=http://viagraprice04.com/>price of viagra</a>
viagra price comparison
<a href=" http://viagraprice04.com/ ">viagra pills price</a>
pfizer viagra price

AlfredmabAlfredmab2017/09/05 10:35<a href=http://buyviagra04.com/>buy viagra online usa</a>
buy real viagra online
<a href=" http://buyviagra04.com/ ">can you buy viagra over the counter</a>
buy viagra in mexico

JamesSoypeJamesSoype2017/09/05 10:53<a href=http://purchaseviagra04.com/>purchase viagra without prescription</a>
purchase viagra australia
<a href=" http://purchaseviagra04.com/ ">viagra to purchase</a>
purchase viagra from india

AntoniogicAntoniogic2017/09/05 10:53[url=http://orderviagra04.com/]order viagra on line[/url]
phone number to order viagra
<a href=" http://orderviagra04.com/ ">how to order viagra from canada</a>
viagra mail order

JamesSoypeJamesSoype2017/09/05 20:23<a href=http://purchaseviagra04.com/>purchase viagra in mexico</a>
viagra purchase
<a href=" http://purchaseviagra04.com/ ">viagra online purchase</a>
purchase viagra in mexico

AlfredmabAlfredmab2017/09/05 20:23<a href=http://buyviagra04.com/>buy viagra cheapest</a>
buy cheap viagra online
<a href=" http://buyviagra04.com/ ">where can i buy viagra</a>
best place to buy viagra online

AntoniogicAntoniogic2017/09/05 20:23<a href=http://orderviagra04.com/>order viagra from mexican pharmacy</a>
order viagra
<a href=" http://orderviagra04.com/ ">order viagra</a>
can you order viagra online

JamesfemJamesfem2017/09/06 11:14<a href=http://viagracoupononline5.com/>viagra coupon free trial</a>
viagra coupon walgreens
<a href=" http://viagracoupononline5.com/ ">viagra free coupon</a>
viagra coupon cvs

MichaelcamMichaelcam2017/09/06 11:14<a href=http://genericcialisonline5.com/>buying generic cialis</a>
generic cialis india
<a href=" http://genericcialisonline5.com/ ">generic cialis for sale</a>
generic cialis india

JerryLavibJerryLavib2017/09/06 11:14<a href=http://genericviagraonline5.com/>best generic viagra</a>
is there a generic for viagra
<a href=" http://genericviagraonline5.com/ ">is there a generic viagra</a>
viagra generic

JosephkeRJosephkeR2017/09/06 11:17<a href=http://howmuchdoescialiscost5.com/>how much does cialis cost</a>
cialis 5mg cost
<a href=" http://howmuchdoescialiscost5.com/ ">cialis cost walmart</a>
cost of cialis

MatthewPoorkMatthewPoork2017/09/06 11:18<a href=http://bestplacetobuycialisonline5.com/>where can i buy cialis</a>
buy cialis cheap
<a href=" http://bestplacetobuycialisonline5.com/ ">where to buy cialis</a>
buy cialis online

RicharddibRicharddib2017/09/07 11:01<a href=http://vegasslotsonline6.org/>las vegas free online slots</a>
vegas slots online
<a href=" http://vegasslotsonline6.org/ ">vegas world online slots</a>
vegas slots online free

RichardAlifFRichardAlifF2017/09/07 11:06<a href=http://onlinecasinoslots6.org/>casino slots free online</a>
free casino slots online
<a href=" http://onlinecasinoslots6.org/ ">slots of vegas online casino</a>
casino slots free online

ElmerMupElmerMup2017/09/07 12:49<a href=http://onlinecasinonodeposite6.org/>online casino no deposit bonuses</a>
online casino games real money no deposit
<a href=" http://onlinecasinonodeposite6.org/ ">no deposit online casino</a>
no deposit online casino

RickynotRickynot2017/09/07 13:22<a href=http://playonlineroullette6.org/>play roulette online for money</a>
roulette games online free play
<a href=" http://playonlineroullette6.org/ ">play roulette for free online</a>
play roulette for free online

CharlesbubCharlesbub2017/09/07 13:22<a href=http://onlineroulettespielen6.org/>roulette online spielen</a>
system spielen roulette
<a href=" http://onlineroulettespielen6.org/ ">kostenlos roulette spielen</a>
gratis roulette online spielen

WaynedesWaynedes2017/09/08 08:39<a href=http://prednisoneprice7.com/>price of prednisone in india</a>
prednisone price without insurance
<a href=" http://prednisoneprice7.com/ ">price of prednisone</a>
price of prednisone 10mg

ErnestCicErnestCic2017/09/08 08:39<a href=http://viagraforsale7.com/>viagra for sale</a>
viagra for sale at walmart
<a href=" http://viagraforsale7.com/ ">herb viagra for sale</a>
viagra for sale at walmart

CraigKawCraigKaw2017/09/08 12:22<a href=http://buyzithromax7.com/>buy zithromax for chlamydia</a>
where can i buy zithromax
<a href=" http://buyzithromax7.com/ ">buy zithromax for pets</a>
buy zithromax online

RuebenjemRuebenjem2017/09/08 12:25<a href=http://tadalafilbestprice7.com/>cialis tadalafil 20mg price</a>
tadalafil 20mg price
<a href=" http://tadalafilbestprice7.com/ ">best price for tadalafil tablets</a>
tadalafil 5mg price canada

JoshuaplemiJoshuaplemi2017/09/08 12:51<a href=http://viagracost7.com/>cost of cialis vs viagra</a>
viagra cost walmart
<a href=" http://viagracost7.com/ ">cost of viagra</a>
what does viagra cost

DustinquaroDustinquaro2017/09/08 12:51<a href=http://cialisprice7.com/>cialis 20 mg price walgreens</a>
price of cialis 20mg
<a href=" http://cialisprice7.com/ ">cialis price comparison</a>
cialis 20mg price

KennethbloorKennethbloor2017/09/08 12:51<a href=http://ciproprice7.com/>price of cipro</a>
cipro 500mg price
<a href=" http://ciproprice7.com/ ">price of 10 cipro 500mg</a>
price of name brand cipro 750mg

MelvinBapMelvinBap2017/09/08 12:51<a href=http://zoloftcost7.com/>how much does zoloft cost without insurance</a>
how much does zoloft cost
<a href=" http://zoloftcost7.com/ ">zoloft cost walmart</a>
what does zoloft cost without insurance

JamieMoxJamieMox2017/09/08 12:52<a href=http://sertralineprice7.com/>sertraline price without insurance</a>
price for sertraline
<a href=" http://sertralineprice7.com/ ">retail price of sertraline</a>
sertraline price at walmart

JaredhopJaredhop2017/09/08 12:57<a href=http://clomidforsale7.com/>clomid tablets for sale</a>
10 clomid pills for sale
<a href=" http://clomidforsale7.com/ ">clomid for sale</a>
clomid uk for sale

BlakeLonBlakeLon2017/09/08 12:57<a href=http://buyprednisone7.com/>buy prednisone online overnight</a>
buy prednisone online
<a href=" http://buyprednisone7.com/ ">buy prednisone online canada</a>
buy prednisone online canada

JosephmycleJosephmycle2017/09/08 12:57<a href=http://ciprofloxacinprice7.com/>ciprofloxacin generic price walmart</a>
ciprofloxacin hydrocortisone price
<a href=" http://ciprofloxacinprice7.com/ ">ciprofloxacin price walgreens</a>
ciprofloxacin price without insurance

MelvinlepMelvinlep2017/09/09 15:26<a href=http://orderviagra8.com/>order viagra online safely</a>
viagra order online
<a href=" http://orderviagra8.com/ ">how to order viagra online</a>
order viagra

WilliamawakeWilliamawake2017/09/09 15:30<a href=http://buytamoxifen8.com/>tamoxifen citrate buy</a>
buy tamoxifen citrate
<a href=" http://buytamoxifen8.com/ ">buy tamoxifen online</a>
buy tamoxifen

HectorSoypeHectorSoype2017/09/09 15:37<a href=http://buyvaltrex8.com/>valtrex buy</a>
buy valtrex cheap
<a href=" http://buyvaltrex8.com/ ">buy valtrex</a>
buy valtrex without prescription

FrankhopFrankhop2017/09/09 15:37<a href=http://sildenafilforsale8.com/>sildenafil for sale</a>
sildenafil 100 mg for sale
<a href=" http://sildenafilforsale8.com/ ">sildenafil for sale online</a>
sildenafil for sale

AntonioGaifeAntonioGaife2017/09/09 16:16<a href=http://valacyclovirprice8.com/>valacyclovir hcl 1 gram price</a>
price of valacyclovir
<a href=" http://valacyclovirprice8.com/ ">valacyclovir price walgreens</a>
valacyclovir hcl 1 gram price

AnthonycokAnthonycok2017/09/09 16:16<a href=http://buyantabuse8.com/>buy antabuse online with prescription</a>
where can i buy antabuse
<a href=" http://buyantabuse8.com/ ">where to buy antabuse</a>
where to buy antabuse

KeithEstitKeithEstit2017/09/09 16:16<a href=http://doxycyclineprice8.com/>doxycycline price</a>
doxycycline price
<a href=" http://doxycyclineprice8.com/ ">doxycycline price at walmart</a>
price of doxycycline

MartinturgeMartinturge2017/09/09 16:16<a href=http://orderclomid8.com/>order clomid online</a>
how to order clomid online
<a href=" http://orderclomid8.com/ ">order clomid online 2017</a>
order clomid uk

ErnestCicErnestCic2017/09/10 23:27<a href=http://viagraforsale7.com/>viagra for sale online</a>
cheap viagra for sale
<a href=" http://viagraforsale7.com/ ">viagra for sale cheap</a>
viagra for sale online usa

JosephTobJosephTob2017/09/11 00:05<a href=http://cialisgenericbestprice5.com/>cialis best price</a>
cialis 20mg price
<a href=" http://cialisgenericbestprice5.com/ ">cialis price</a>
cialis generic best price

AntoniogicAntoniogic2017/09/11 00:20<a href=http://orderviagra04.com/>how to order viagra online safely</a>
how to order viagra online
<a href=" http://orderviagra04.com/ ">viagra online order</a>
mail order viagra legal

RickybrealRickybreal2017/09/11 01:40<a href=http://buyazithromycin02.org/>where can i buy azithromycin 500mg tablets</a>
azithromycin buy
<a href=" http://buyazithromycin02.org/ ">buy azithromycin usa</a>
buy azithromycin online overnight

RichardLapRichardLap2017/09/11 01:40<a href=http://viagraforsale04.com/>real viagra for sale</a>
viagra for sale online
<a href=" http://viagraforsale04.com/ ">viagra for sale</a>
viagra pills for sale

WilliamSemWilliamSem2017/09/11 02:08<a href=http://buyprednisolone02.org/>where can i buy prednisolone</a>
where can i buy prednisolone online
<a href=" http://buyprednisolone02.org/ ">prednisolone to buy</a>
buy prednisolone for cats

MatthewPlewsMatthewPlews2017/09/11 23:27<a href=http://buypapersonline10.com/>buy ph paper online</a>
buy paper online
<a href=" http://buypapersonline10.com/ ">buy research paper online</a>
buy research paper online

JerryDuataJerryDuata2017/09/11 23:27<a href=http://buyingresearchpaper10.com/>buying a research paper for college</a>
what is the best website for buying a research paper
<a href=" http://buyingresearchpaper10.com/ ">research paper topics about buying animals</a>
buying a research paper

DanielHoxDanielHox2017/09/11 23:50<a href=http://customwrappingpaper10.com/>custom wrapping paper</a>
custom wrapping paper toronto
<a href=" http://customwrappingpaper10.com/ ">custom made wrapping paper</a>
custom wrapping paper printing

ArthurpraftArthurpraft2017/09/11 23:52<a href=http://paperwriter10.com/>college paper writer</a>
paper writer service
<a href=" http://paperwriter10.com/ ">online paper writer</a>
online research paper writer

DavidVahDavidVah2017/09/12 01:20<a href=http://writemypaper10.com/>write my research papers</a>
write my college papers
<a href=" http://writemypaper10.com/ ">is it possible to get through college paying a service to write my papers</a>
can i write up my own divorce papers

RichardgatRichardgat2017/09/12 01:40<a href=http://resumepaper10.com/>where to buy resume paper</a>
resume paper
<a href=" http://resumepaper10.com/ ">best resume paper</a>
resume paper vs regular paper

DavidUnepeDavidUnepe2017/09/12 01:42<a href=http://essaywritingservice10.com/>best essay writing service</a>
writing essay service
<a href=" http://essaywritingservice10.com/ ">cheapest essay writing service</a>
what is the best essay writing service

MichaelNokMichaelNok2017/09/12 02:15<a href=http://writemyessay10.com/>write my essay free</a>
write my essay online review
<a href=" http://writemyessay10.com/ ">can someone write my essay for me</a>
write my essay free

CharlessenCharlessen2017/09/12 02:50<a href=http://writemyessayforme10.com/>write my essay for me reviews</a>
write my essay for me in 3 hours
<a href=" http://writemyessayforme10.com/ ">write my essay for me discount code</a>
write my college essay for me

HenrybicHenrybic2017/09/12 02:56<a href=http://paperhelp10.com/>term paper help</a>
research paper help
<a href=" http://paperhelp10.com/ ">research paper writing help</a>
help with writing paper

HowardmugHowardmug2017/09/13 13:22<a href=http://casinolive12.com/>live casino buffet</a>
maryland live casino
<a href=" http://casinolive12.com/ ">maryland live casino</a>
sunland park casino live music

JamesalirmJamesalirm2017/09/13 14:05<a href=http://goldennuggetonline12.com/>golden nugget online casino review</a>
golden nugget casino games online
<a href=" http://goldennuggetonline12.com/ ">golden nugget online casino nj</a>
golden nugget online review

CharlesPashyCharlesPashy2017/09/13 14:05<a href=http://playgamesformoney12.com/>play games online for money</a>
play games for money for free
<a href=" http://playgamesformoney12.com/ ">play games online for money</a>
play online games for free and win money

HaroldlutleHaroldlutle2017/09/13 15:38<a href=http://accasino12.com/>resorts casino ac phone number</a>
ceasers casino ac
<a href=" http://accasino12.com/ ">first casino in ac</a>
tropicana casino ac

WayneenrizWayneenriz2017/09/13 17:45<a href=http://howtowinmoneyonline12.com/>how to win free money online</a>
how to win real money online
<a href=" http://howtowinmoneyonline12.com/ ">how to win free money online instantly</a>
how to make online tournaments to win real money from video games

HassanNeuttHassanNeutt2017/09/26 10:21report writingessay outlinehow to start a paragraph
essay layoutdescriptive essay examples <a href=https://lazyessayclub.com/>who am i essay</a> essay writing on swachh bharat in teluguesaf
plain writingessay writing servicewhat is essay

TimothyBofTimothyBof2017/09/26 13:01buy cialis melbourneis it safe to buy generic cialis onlinewhere to buy cialis in los angeles
buy cialis jellypurchase peptides cialis review <a href=http://thecialis.us/>247 overnightpharmacy buy cialis usa</a>where can i buy cialis pillsbuy cialis canada 2013
cheap discount cialis buy official cialis

MyronHogMyronHog2017/09/26 13:02is it safe to buy generic cialis online buy cialis fast shipping
table order cialis online <a href=http://cialiscity.us/>best site to order cialis</a> order cialis online canada
buy cialis paypal australia cheap generic cialis canada

GordonjekGordonjek2017/09/26 13:04buy authentic levitrabuy levitra usbuy generic viagra cialis levitra
buy levitra discountcheap generic levitra professional<a href=http://thelevitra.us/>buy levitra in uk</a> cheap levitra professionalbuy 40 mg levitra
cheap levitra online ukbuy levitra 5mgbuy levitra orodispersible

CarlosnuaroCarlosnuaro2017/09/26 14:15buy generic levitra with dapoxetine cheap levitra australia
buy genuine levitracan i buy levitra in mexico<a href=http://elevitra.us/>levitra by mail order</a> buy levitra online 24 hoursbuy levitra south africa
buy cialis and levitra onlinebuy levitra canada onlinehow to order levitra online

RichardRafRichardRaf2017/09/26 14:30buy generic cialis from ukbuy cialis uk next day deliverybuy cialis online canadian pharmacy
order cialis greecebuy cialis manchester <a href=http://mycialis.us/>want to purchase cialis</a> where can i buy cialis in londonsafest way to buy cialis online
how to buy cialis in australiaorder cialis viagra onlinecialis purchase in uk

ManuelterManuelter2017/09/26 14:42buy viagra cialis or levitrabuy levitra overnightbuy levitra online
buy viagra levitra rxmeds hub order levitra online <a href=http://mylevitra.us/>how to buy levitra in usa</a> cheap levitra onlinebuy genuine levitra online
cheap levitra online ukcheap levitra professionalhow can i buy levitra

HassanNeuttHassanNeutt2017/09/26 18:18resume writingcreative writingcommon app essay
how to start a paragraphcollege essay examples <a href=https://lazyessayclub.com/>writing prompts</a> cursive writingconclusion of an essay
odia essay on mahatma gandhistructure of an essaycreative writing

PeterRefPeterRef2017/09/27 23:07<a href=http://resortsonlinecasino12.com/>resorts online casino complaints</a>
resorts casino online players log in atlantic city
<a href=" http://resortsonlinecasino12.com/ ">resorts online casino</a>
resorts online casino

RogerherRogerher2017/09/28 00:51<a href=http://gambleonline12.com/>gamble online</a>
can you gamble online
<a href=" http://gambleonline12.com/ ">gamble for money online</a>
gamble online

DavidNetDavidNet2017/09/28 01:27<a href=http://winrealmoneyonlineinstantly12.com/>free penny slots</a>
free money online
<a href=" http://winrealmoneyonlineinstantly12.com/ ">free casino games</a>
online casino games

GregoryViottGregoryViott2017/09/28 01:27<a href=http://njonlinecasino12.com/>nj online casino no deposit</a>
tropicana casino online nj
<a href=" http://njonlinecasino12.com/ ">golden nugget online casino nj</a>
online nj casino

CalvindayncCalvindaync2017/09/28 02:50<a href=http://harrahsonline12.com/>harrahs online casino</a>
harrahs online casinos
<a href=" http://harrahsonline12.com/ ">harrahs free online casino games</a>
harrahs free online video poker

HerbertCaWHerbertCaW2017/09/28 03:09<a href=http://onlinecasinosforrealmoney12.com/>us online casinos for real money</a>
online casinos that cn play for free and then for real money in us
<a href=" http://onlinecasinosforrealmoney12.com/ ">casinos online for real money</a>
play online casinos for real money

JosephDotJosephDot2018/03/12 16:30
You have made your point!

tomar cialis y viagra al mismo tiempo <a href="http://cialisfidel.com/">cialis generic</a> cialis mais barato <a href=http://cialisfidel.com/>cialis without a doctor prescription</a>

CanadianTamCanadianTam2018/03/15 09:38
Thank you for the auspicious writeup. It in reality was a enjoyment account it. Look complex to more introduced agreeable from you! By the way, how can we keep in touch?
drugs from canada
<a href=http://canadianpharmaciescubarx.com/#>canadian pharmacies shipping to usa</a>
drugs online <a href="http://canadianpharmaciescubarx.com/#">canada online pharmacies</a>

TrevorunjuhTrevorunjuh2018/03/15 11:10
Hey I know this is off topic but I was wondering if you knew of any widgets I could add to my blog that automatically tweet my newest twitter updates. I've been looking for a plug-in like this for quite some time and was hoping maybe you would have some experience with something like this. Please let me know if you run into anything. I truly enjoy reading your blog and I look forward to your new updates.
<a href=http://genericviagracubarx.com/#>viagra for sale</a>
physicians who prescribe viagra in houston
<a href="http://genericviagracubarx.com/#">otc viagra</a>

CanadianTamCanadianTam2018/03/15 22:07
I visited several blogs except the audio quality for audio songs current at this site is in fact superb.
pharmacy prescription
<a href=http://canadianpharmaciescubarx.com/#>canadian cialis</a>
buy prescription drugs canada <a href="http://canadianpharmaciescubarx.com/#">list of approved canadian pharmacies</a>

CanadaunjuhCanadaunjuh2018/03/15 22:31
Appreciate this post. Let me try it out.

canadian pharmacy online
<a href=http://canadianpharmacycubarx.com/#>canadapharmacy</a>
online pharmacies canada
<a href="http://canadianpharmacycubarx.com/#">online canadian pharmacies</a>

TrevorunjuhTrevorunjuh2018/03/16 00:22
Awesome blog you have here but I was wanting to know if you knew of any discussion boards that cover the same topics discussed in this article? I'd really like to be a part of group where I can get opinions from other experienced people that share the same interest. If you have any recommendations, please let me know. Cheers!
<a href=http://genericviagracubarx.com/#>superdrug viagra</a>
50 cent generic viagra
<a href="http://genericviagracubarx.com/#">buying viagra online</a>

LelandbakLelandbak2018/03/16 01:29
I don't know whether it's just me or if everyone else encountering issues with your website. It seems like some of the text within your posts are running off the screen. Can someone else please comment and let me know if this is happening to them too? This may be a problem with my internet browser because I've had this happen previously. Kudos
<a href=http://canadianpharmaciesgo.com/>canadian pharmacies online</a>

CanadianTamCanadianTam2018/03/16 08:57
Incredible! This blog looks just like my old one! It's on a completely different topic but it has pretty much the same page layout and design. Great choice of colors!
cialis online
<a href=http://canadianpharmaciescubarx.com/#>canada drugs online</a>
canada drugs online pharmacy <a href="http://canadianpharmaciescubarx.com/#">pharmacy canada</a>

CanadaunjuhCanadaunjuh2018/03/16 09:14
Someone necessarily assist to make critically posts I'd state. This is the very first time I frequented your web page and so far? I amazed with the research you made to create this actual publish incredible. Great process!

canadian discount pharmacy
<a href=http://canadianpharmacycubarx.com/#>online pharmacies</a>
pain meds online without doctor prescription
<a href="http://canadianpharmacycubarx.com/#">canadian pharmacy viagra brand</a>

TrevorunjuhTrevorunjuh2018/03/16 11:42
Hey, I think your website might be having browser compatibility issues. When I look at your blog site in Firefox, it looks fine but when opening in Internet Explorer, it has some overlapping. I just wanted to give you a quick heads up! Other then that, superb blog!
<a href=http://genericviagracubarx.com/#>viagra over counter</a>
does viagra raise blood pressure
<a href="http://genericviagracubarx.com/#">over the counter viagra</a>

UnfomDinoUnfomDino2018/03/16 13:24<a href=http://viagraskf.com>nizagara</a>
viagra on line no prec http://viagraskf.com/ buy generic viagra

UnfomDinoUnfomDino2018/03/16 14:45<a href=http://viagraskf.com>viagra pills</a>
sildenafil citrate http://viagraskf.com/ medix

UnfomDinoUnfomDino2018/03/16 14:51<a href=http://viagraskf.com>viagra generic</a>
generic viagra http://viagraskf.com/ viagra online

UnfomDinoUnfomDino2018/03/16 14:51<a href=http://viagraskf.com>viagra for women</a>
what is viagra http://viagraskf.com/ nizagara

LelandbakLelandbak2018/03/16 15:00
Heya i'm for the first time here. I found this board and I find It truly useful & it helped me out a lot. I hope to give something back and help others like you aided me.
<a href=http://canadianpharmaciesgo.com/>Canadian Online Pharmacy</a>

UnfomDinoUnfomDino2018/03/16 15:59<a href=http://viagraskf.com>gra online</a>
viagra coupon http://viagraskf.com/ generic viagra prices

LelandbakLelandbak2018/03/16 16:08
Hello, I read your blog like every week. Your story-telling style is witty, keep up the good work!
<a href=http://canadianpharmaciesgo.com/>canadian pharmacies online</a>

LelandbakLelandbak2018/03/16 17:19
Wonderful goods from you, man. I have have in mind your stuff previous to and you are simply too excellent. I really like what you've obtained right here, certainly like what you're saying and the best way by which you say it. You're making it entertaining and you still take care of to stay it wise. I can not wait to learn much more from you. That is really a wonderful site.
<a href=http://canadianpharmaciesgo.com/>Canadian Online Pharmacy</a>

UnfomDinoUnfomDino2018/03/16 17:25<a href=http://viagraskf.com>generic viagra from amazon</a>
virga http://viagraskf.com/ viagra for sale uk

UnfomDinoUnfomDino2018/03/16 17:31<a href=http://viagraskf.com>what is viagra</a>
sildenafil http://viagraskf.com/ Viagra

UnfomDinoUnfomDino2018/03/16 17:32<a href=http://viagraskf.com>canadian viagra</a>
nizagara http://viagraskf.com/ where can i get viagra from

UnfomDinoUnfomDino2018/03/16 18:58<a href=http://viagraskf.com>where to buy viagra</a>
viagra pills http://viagraskf.com/ viagra in farmacia senza ricetta

UnfomDinoUnfomDino2018/03/16 18:59<a href=http://viagraskf.com>viagra tablets</a>
buy viagra online http://viagraskf.com/ sildenafil

UnfomDinoUnfomDino2018/03/16 19:05<a href=http://viagraskf.com>cheap viagra</a>
medix http://viagraskf.com/ viagra prices

LelandbakLelandbak2018/03/16 19:43
Attractive section of content. I just stumbled upon your web site and in accession capital to assert that I get in fact enjoyed account your blog posts. Anyway I'll be subscribing to your feeds and even I achievement you access consistently rapidly.
<a href=http://canadianpharmaciesgo.com/>canadian pharmacies online</a>

UnfomDinoUnfomDino2018/03/16 20:19<a href=http://viagraskf.com>viagra tablets</a>
viagra pills http://viagraskf.com/ viagra ohne rezept auf rechnung

CanadianTamCanadianTam2018/03/16 20:27
Hi there to all, the contents present at this website are in fact amazing for people knowledge, well, keep up the nice work fellows.
pharmacy cost comparison
<a href=http://canadianpharmaciescubarx.com/#>canadian drugs</a>
canadian pharma companies <a href="http://canadianpharmaciescubarx.com/#">cialis canadian pharmacy</a>

UnfomDinoUnfomDino2018/03/16 20:31<a href=http://viagraskf.com>viagra kaufen</a>
pharmacy online http://viagraskf.com/ gra online

UnfomDinoUnfomDino2018/03/16 20:37<a href=http://viagraskf.com>sildenafil citrate 100mg</a>
online viagra http://viagraskf.com/ viagra for sale

CanadaunjuhCanadaunjuh2018/03/16 20:47
I was suggested this blog by my cousin. I am not sure whether this post is written by him as nobody else know such detailed about my trouble. You're amazing! Thanks!

canadian rx
<a href=http://canadianpharmacycubarx.com/#>aarp recommended canadian pharmacies</a>
canadapharmacyonline com
<a href="http://canadianpharmacycubarx.com/#">canadapharmacy</a>

LelandbakLelandbak2018/03/16 20:52
Thanks for the marvelous posting! I quite enjoyed reading it, you're a great author. I will always bookmark your blog and definitely will come back from now on. I want to encourage you to ultimately continue your great posts, have a nice holiday weekend!
<a href=http://canadianpharmaciesgo.com/>Canadian Pharmacy</a>

UnfomDinoUnfomDino2018/03/16 21:43<a href=http://viagraskf.com>sildenafil</a>
viagra tablets http://viagraskf.com/ sildenafil citrate 100mg

TrevorunjuhTrevorunjuh2018/03/16 21:49
It is in reality a nice and useful piece of information. I'm satisfied that you shared this helpful information with us. Please stay us informed like this. Thank you for sharing.
<a href=http://genericviagracubarx.com/#>Viagra</a>
viagra softtabs
<a href="http://genericviagracubarx.com/#">buy sildenafil online</a>

UnfomDinoUnfomDino2018/03/16 22:00<a href=http://viagraskf.com>viagra tablets</a>
viagra online http://viagraskf.com/ canadian viagra

LelandbakLelandbak2018/03/16 22:05
Thanks for finally writing about > %blog_title% < Loved it!
<a href=http://canadianpharmaciesgo.com/>Canadian Drugs</a>

UnfomDinoUnfomDino2018/03/16 22:08<a href=http://viagraskf.com>bisagra</a>
buy viagra http://viagraskf.com/ viagra for women

LelandbakLelandbak2018/03/16 23:23
It's remarkable designed for me to have a web page, which is valuable for my knowledge. thanks admin
<a href=http://canadianpharmaciesgo.com/>Canadian Pharmacy</a>

UnfomDinoUnfomDino2018/03/16 23:28<a href=http://viagraskf.com>canadian viagra</a>
buy viagra online http://viagraskf.com/ generic viagra

UnfomDinoUnfomDino2018/03/17 00:41<a href=http://viagraskf.com>generic viagra</a>
viagra in farmacia senza ricetta http://viagraskf.com/ viagra coupon

LelandbakLelandbak2018/03/17 00:46
Oh my goodness! Awesome article dude! Thank you so much, However I am having troubles with your RSS. I don't know why I am unable to join it. Is there anybody getting similar RSS problems? Anybody who knows the answer will you kindly respond? Thanx!!
<a href=http://canadianpharmaciesgo.com/>Canadian Pharmacies</a>

UnfomDinoUnfomDino2018/03/17 00:59<a href=http://viagraskf.com>sildenafil</a>
buy viagra http://viagraskf.com/ viagra kaufen

UnfomDinoUnfomDino2018/03/17 01:09<a href=http://viagraskf.com>viagra kaufen</a>
viagra samples http://viagraskf.com/ generic viagra

LelandbakLelandbak2018/03/17 01:58
If some one wishes to be updated with latest technologies after that he must be pay a visit this site and be up to date all the time.
<a href=http://canadianpharmaciesgo.com/>canadian pharmacies online</a>

UnfomDinoUnfomDino2018/03/17 02:02<a href=http://viagraskf.com>buy viagra</a>
Viagra http://viagraskf.com/ online viagra

UnfomDinoUnfomDino2018/03/17 02:24<a href=http://viagraskf.com>generic viagra prices</a>
viagra ohne rezept aus deutschland http://viagraskf.com/ buy viagra online

LelandbakLelandbak2018/03/17 02:58
Your method of telling all in this piece of writing is actually good, every one can without difficulty understand it, Thanks a lot.
<a href=http://canadianpharmaciesgo.com/>canadian pharmacies online</a>

LelandbakLelandbak2018/03/17 04:00
whoah this blog is fantastic i like reading your posts. Stay up the great work! You know, a lot of individuals are looking around for this information, you can aid them greatly.
<a href=http://canadianpharmaciesgo.com/>Canadian Pharmacy</a>

LelandbakLelandbak2018/03/17 04:58
Hi everyone, it's my first go to see at this web page, and paragraph is really fruitful in favor of me, keep up posting these types of articles.
<a href=http://canadianpharmaciesgo.com/>canadian pharmacies online</a>

LelandbakLelandbak2018/03/17 05:54
I got this site from my buddy who shared with me on the topic of this website and now this time I am visiting this web site and reading very informative content at this place.
<a href=http://canadianpharmaciesgo.com/>Canadian Pharmacies</a>

LelandbakLelandbak2018/03/17 06:48
Great post. I was checking constantly this blog and I'm impressed! Very helpful information specially the last part :) I care for such information much. I was seeking this particular information for a long time. Thank you and best of luck.
<a href=http://canadianpharmaciesgo.com/>canadian pharmacies online</a>

LelandbakLelandbak2018/03/17 07:47
I have read so many posts regarding the blogger lovers but this article is actually a good post, keep it up.
<a href=http://canadianpharmaciesgo.com/>canadian pharmacies online</a>

LelandbakLelandbak2018/03/17 08:47
This piece of writing will help the internet people for creating new webpage or even a blog from start to end.
<a href=http://canadianpharmaciesgo.com/>Canadian Drugs</a>

LelandbakLelandbak2018/03/17 09:46
Thank you for some other informative site. The place else could I am getting that kind of info written in such a perfect method? I have a project that I am simply now running on, and I have been at the look out for such info.
<a href=http://canadianpharmaciesgo.com/>canadian pharmacies online</a>

LelandbakLelandbak2018/03/17 11:53
I am curious to find out what blog system you have been using? I'm having some small security problems with my latest blog and I would like to find something more safe. Do you have any solutions?
<a href=http://canadianpharmaciesgo.com/>Canadian Pharmacies</a>

LelandbakLelandbak2018/03/17 13:07
This text is priceless. When can I find out more?
<a href=http://canadianpharmaciesgo.com/>Canadian Pharmacy</a>

LelandbakLelandbak2018/03/17 14:16
Great post. I was checking continuously this weblog and I'm inspired! Extremely helpful information specifically the final phase :) I deal with such information much. I was seeking this particular info for a long time. Thank you and good luck.
<a href=http://canadianpharmaciesgo.com/>canadian pharmacies online</a>

UnfomDinoUnfomDino2018/03/17 15:11<a href=http://viagraskf.com>viagra pills</a>
nizagara http://viagraskf.com/ what is viagra

UnfomDinoUnfomDino2018/03/17 15:34<a href=http://viagraskf.com>viagra kaufen</a>
Viagra http://viagraskf.com/ buy viagra online

LelandbakLelandbak2018/03/17 16:13
I've been exploring for a bit for any high quality articles or blog posts on this kind of area . Exploring in Yahoo I at last stumbled upon this site. Reading this information So i'm satisfied to exhibit that I've an incredibly good uncanny feeling I discovered exactly what I needed. I so much undoubtedly will make sure to do not overlook this web site and provides it a glance regularly.
<a href=http://viagraoblue.com/>viagra pills for sale</a>

UnfomDinoUnfomDino2018/03/17 16:26<a href=http://viagraskf.com>viagra online</a>
viagra side effects http://viagraskf.com/ generic viagra

UnfomDinoUnfomDino2018/03/17 16:53<a href=http://viagraskf.com>generic viagra from amazon</a>
buy viagra http://viagraskf.com/ viagra for women

UnfomDinoUnfomDino2018/03/17 17:04<a href=http://viagraskf.com>generic viagra prices</a>
Viagra http://viagraskf.com/ generic viagra

LelandbakLelandbak2018/03/17 17:18
Appreciate the recommendation. Let me try it out.
<a href=http://viagraoblue.com/>viagra for women over 50</a>

UnfomDinoUnfomDino2018/03/17 17:39<a href=http://viagraskf.com>viagra ohne rezept aus deutschland</a>
viagra on line http://viagraskf.com/ viagra ohne rezept aus deutschland

UnfomDinoUnfomDino2018/03/17 18:09<a href=http://viagraskf.com>cheap viagra</a>
medix http://viagraskf.com/ viagra coupons

UnfomDinoUnfomDino2018/03/17 18:19<a href=http://viagraskf.com>bisagra</a>
viagra coupons http://viagraskf.com/ buy viagra online

LelandbakLelandbak2018/03/17 18:24
It's awesome for me to have a web site, which is valuable designed for my knowledge. thanks admin
<a href=http://viagraoblue.com/>viagra over the counter</a>

UnfomDinoUnfomDino2018/03/17 18:51<a href=http://viagraskf.com>medix</a>
viagra on line no prec http://viagraskf.com/ Viagra

UnfomDinoUnfomDino2018/03/17 19:21<a href=http://viagraskf.com>viagra generic</a>
generic viagra http://viagraskf.com/ virga

LelandbakLelandbak2018/03/17 19:26
Hmm it appears like your website ate my first comment (it was extremely long) so I guess I'll just sum it up what I wrote and say, I'm thoroughly enjoying your blog. I too am an aspiring blog writer but I'm still new to everything. Do you have any helpful hints for beginner blog writers? I'd definitely appreciate it.
<a href=http://viagraoblue.com/>viagra for sale</a>

UnfomDinoUnfomDino2018/03/17 19:34<a href=http://viagraskf.com>viagra for sale uk</a>
medix http://viagraskf.com/ viagra for women

UnfomDinoUnfomDino2018/03/17 20:01<a href=http://viagraskf.com>online viagra</a>
buy generic viagra http://viagraskf.com/ pharmacy

LelandbakLelandbak2018/03/17 20:30
Normally I do not read post on blogs, but I wish to say that this write-up very pressured me to try and do so! Your writing style has been surprised me. Thanks, very great post.
<a href=http://viagraoblue.com/>buy viagra</a>

UnfomDinoUnfomDino2018/03/17 20:34<a href=http://viagraskf.com>viagra for women</a>
viagra for sale http://viagraskf.com/ virga

UnfomDinoUnfomDino2018/03/17 21:16<a href=http://viagraskf.com>viagra ohne rezept aus deutschland</a>
Viagra http://viagraskf.com/ generic viagra

LelandbakLelandbak2018/03/17 21:41
Excellent goods from you, man. I have understand your stuff previous to and you are just extremely magnificent. I really like what you've acquired here, certainly like what you are saying and the way in which you say it. You make it entertaining and you still care for to keep it wise. I can't wait to read much more from you. This is actually a great site.
<a href=http://viagraoblue.com/>buy sildenafil online</a>

UnfomDinoUnfomDino2018/03/17 21:53<a href=http://viagraskf.com>viagra on line</a>
viagra kaufen http://viagraskf.com/ sildenafil citrate

UnfomDinoUnfomDino2018/03/17 22:05<a href=http://viagraskf.com>bisagra</a>
buy generic viagra http://viagraskf.com/ buy generic viagra

UnfomDinoUnfomDino2018/03/17 22:32<a href=http://viagraskf.com>viagra for women</a>
virga http://viagraskf.com/ bisagra

LelandbakLelandbak2018/03/17 22:54
Excellent site you have here but I was wondering if you knew of any community forums that cover the same topics talked about in this article? I'd really love to be a part of online community where I can get feedback from other experienced people that share the same interest. If you have any recommendations, please let me know. Appreciate it!
<a href=http://viagraoblue.com/>buy viagra online</a>

UnfomDinoUnfomDino2018/03/17 23:14<a href=http://viagraskf.com>viagra for women</a>
viagra coupon http://viagraskf.com/ viagra ohne rezept aus deutschland

UnfomDinoUnfomDino2018/03/17 23:31<a href=http://viagraskf.com>where to buy viagra</a>
viagra coupon http://viagraskf.com/ virga

UnfomDinoUnfomDino2018/03/17 23:58<a href=http://viagraskf.com>where to buy viagra</a>
viagra kaufen http://viagraskf.com/ viagra samples

LelandbakLelandbak2018/03/18 00:14
First of all I want to say terrific blog! I had a quick question in which I'd like to ask if you don't mind. I was interested to find out how you center yourself and clear your thoughts prior to writing. I've had a difficult time clearing my mind in getting my ideas out. I truly do enjoy writing however it just seems like the first 10 to 15 minutes tend to be wasted simply just trying to figure out how to begin. Any suggestions or hints? Thanks!
<a href=http://viagraoblue.com/>viagra over counter</a>

UnfomDinoUnfomDino2018/03/18 00:49<a href=http://viagraskf.com>medix</a>
potenzmittel http://viagraskf.com/ online viagra

LelandbakLelandbak2018/03/18 01:17
Wow, wonderful blog layout! How long have you been blogging for? you made blogging look easy. The overall look of your web site is excellent, let alone the content!
<a href=http://viagraoblue.com/>prescription free viagra in australia</a>

トラックバック - http://zigorou.g.hatena.ne.jp/ZIGOROu/20090321