$BBh(B1$B2s(B $B3HD%%i%$%V%i%j$N:n@.(B(1)

$BA0ED=$8c(B

$B$O$8$a$K(B

Ruby hacker$B$N$_$J$5$s!"$3$s$K$A$O!#:#2s$+$i?t2s$N4V!"8eF#8,B@O:$5$s$N(B $BBeLr$r$D$H$a$5$;$F$$$?$@$/$3$H$K$J$j$^$7$?!#(B

$B$"$A$3$A$G!"8eF#$5$s$N5-;v$r$b$C$HFI$_$?$$!"$H$$$&@<$r<*$K$9$k$N$G!"=q(B $B$-$E$i$$$3$H$3$N>e$J$$$N$G$9$,!"2?$H$+$,$s$P$C$F=q$$$F$$$-$^$9$N$G!"29(B $B$+$$L\$G8+

$B$5$F!"Bh(B1$B2s$O3HD%%i%$%V%i%j$N:[email protected]}K!$K$D$$$F$NOC$G$9!#(BRuby$B$NO":\$N$/(B $B$;$K(BRuby$B$N%3!<%I$,$"$^$j=P$FMh$^$;$s$,!"$I$&$+$4MF

$B3HD%%i%$%V%i%j$C$F(B?

$B3HD%%i%$%V%i%j$H$$$&$N$O(BC$B$G5-=R$5$l$?(BRuby$BMQ$N%i%$%V%i%j$N$3$H$G$9!#$H(B $B$$$&$H(BString$B$d(BArray$B$J$I$NI8=`%i%$%V%i%j$b3HD%%i%$%V%i%j$J$N$+!"$H$*$C(B $B$7$c$kJ}$b$$$k$+$b$7$l$^$;$s$,(B($BI.

$B3HD%%i%$%V%i%j$O0JA0$O3HD%%b%8%e!<%k$H8F$P$l$F$$$?$N$G$9$,!"(BRuby$B$G$O%b(B $B%8%e!<%k$H$$$&MQ8l$KJL$N0UL#$,$"$k$N$G!":.Mp$rHr$1$k$?$a!"3HD%%i%$%V%i(B $B%j$H8F$P$l$k$h$&$K$J$j$^$7$?!#(B

$BM>CL$K$J$j$^$9$,!"%3%s%T%e!<%?MQ8l$K$OF1$8$h$&$J$b$N$r;X$98@MU$,?'!9$"$C(B $B$?$j!"F1$88@MU$,0c$&$b$N$r;X$7$F$$$?$j$7$F!":.Mp$9$k$3$H$,B?$$$G$9$M!#(B $B$?$H$($P!"(BRuby$B$G$O%*%V%8%'%/%H$r(B($B%U%!%$%k$KJ]B8$7$?$j!"%M%C%H%o!<%/$G(B $BE>Aw$9$k$?$a$K(B)$B%P%$%HNs$KJQ49$9$k$3$H$r(Bmarshal$B$H8F$S$^$9$,!"F1$8$3$H$r(B Java$B$G$O(Bserialize$B$H8F$S$^$9!#$^$?!"(Bserialize$B$OJ8L.$K$h$C$F$OGSB>@)8f$N(B $B$h$&$J0UL#$K$J$j$^$9$N$G!"$I$A$i$N0UL#$G;H$C$F$$$k$N$+3NG'$7$J$$$H5DO@(B $B$,$+$_9g$o$J$/$J$C$F$7$^$&$3$H$b$"$j$^$9!#(B[1] $B%K%e!<%9%0%k!<%W$J(B $B$I$G5DO@$9$k;~$O5$$rIU$1$F$/$@$5$$$M!#$H$K$+$/!"(BRuby$B$G$O!V3HD%%i%$%V%i(B $B%j!W$G$9$N$G!"$*4V0c$($N$J$-$h$&!#(B

$B3HD%%i%$%V%i%j$NNc$r5s$2$k$H!"$?$H$($P!"I8=`E:IU$5$l$F$$$k(Bsocket$B%i%$%V(B $B%i%j$J$I$b3HD%%i%$%V%i%j$G$9!#(BRuby$B$N%=!<%9%Q%C%1!<%8$rE83+$9$k$H(Bext$B$H(B $B$$$&%G%#%l%/%H%j$,:n@.$5$l$^$9$,!"$3$N%G%#%l%/%H%j$N2<$KCV$+$l$F$$$k%i(B $B%$%V%i%j(B(socket$B$b$3$l$K4^$^$l$^$9(B)$B$O$_$J3HD%%i%$%V%i%j$J$N$G$9!#$^$?!"(B $B3HD%%i%$%V%i%j$O(BRuby$B$N%=!<%9%"!<%+%$%V$K4^$^$l$k$b$N0J30$K$b!"MM!9$J$b(B $B$N$,%M%C%H%o!<%/>e$GG[I[$5$l$F$*$j!"(BRAA$B$J$I$GF~

$B$9$G$K=R$Y$?$h$&$K3HD%%i%$%V%i%j$O(BC$B$G5-=R$5$l$k$N$G$9$,!"%f!<%6$+$i8+(B $B$l$P!"3HD%%i%$%V%i%j$b(BRuby$B$G5-=R$5$l$?%i%$%V%i%j$HF1$8$h$&$K8+$($^$9!#(B

require "socket"

$B$H$9$l$P!"%i%$%V%i%j$r%m!<%I$9$k$3$H$,$G$-$^$9$7!"(B

s = TCPSocket.new("localhost", "smtp")

$B$N$h$&$K!"3HD%%i%$%V%i%j$GDj5A$5$l$?%/%i%9$d%a%=%C%I$J$I$O!"(BRuby$B$GDj5A(B $B$5$l$?$b$N$HF1$8$h$&$K07$&$3$H$,$G$-$^$9!#(B

$B$D$^$j!"%f!<%6$+$i8+$l$P3HD%%i%$%V%i%j$G$"$m$&$H!"(BRuby$B$G=q$+$l$?%i%$%V(B $B%i%j$G$"$m$&$H4X78$J$$$o$1$G$9!#3HD%%i%$%V%i%j$K$D$$$F2?$bCN$i$J$/$F$b!"(B $B

$B3HD%%i%$%V%i%j$NB8:_M}M3(B

$B$G$O!"(BRuby$B$G=q$1$PHQ$o$7$$%a%b%j4IM}$J$I$+$i0l@Z2rJ|$5$l$k$N$K!"$J$<$o(B $B$6$o$66lO+$7$F(BC$B$G%i%$%V%i%j$r=q$/I,MW$,$"$k$N$G$7$g$&$+!#$3$l$K$O

C$B%i%$%V%i%j$NMxMQ(B

$B@$$NCf$K(BC$BMQ$N%i%$%V%i%j$OHs>o$K$?$/$5$s=P2s$C$F$$$^$9!#0lJ}(BRuby$BMQ$N%i(B $B%$%V%i%j$O$=$l$[$IB?$/$"$j$^$;$s!#$H$$$&$h$j>/$J$$$H8@$C$?J}$,$h$$$G$7$g(B $B$&!#$G$9$+$i!"(BC$BMQ$N%i%$%V%i%j$r(BRuby$B$G;H$$$?$$!"$H$$$&MW5a$,5/$3$C$F$/(B $B$k$N$OEvA3$N$3$H$G$9!#$?$@!";DG0$J$,$i!"(BC$BMQ$N%i%$%V%i%j$r$=$N$^$^(BRuby $B$GMxMQ$9$k$3$H$O$G$-$^$;$s!#(B

$B$=$3$G3HD%%i%$%V%i%j$rMxMQ$9$k$3$H$K$J$j$^$9!#(BC$B%i%$%V%i%j$rMxMQ$9$k$?(B $B$a$N3HD%%i%$%V%i%j$rMQ0U$9$k$3$H$K$h$C$F!"4X@\E*$K(BRuby$B$+$i(BC$B%i%$%V%i%j(B $B$rMxMQ$9$k$o$1$G$9!#3HD%%i%$%V%i%j$r=q$/?M$O$A$g$C$HLLE]$G$9$,!"MxMQ$9(B $B$kB&$O(BC$B$N$3$H$r0U<1$9$kI,MW$O$J$$$N$GHs>o$KJXMx$G$9!#(B

Ruby$B$N%=!<%9%"!<%+%$%V$KI8=`E:IU$5$l$F$$$k3HD%%i%$%V%i%j$O$9$Y$F(BC$B%i%$(B $B%V%i%j$rMxMQ$9$k$?$a$N$b$N$G$9!#(BRAA$B$KEPO?$5$l$F$$$k$b$N$bBgItJ,$,$=$&(B $B$G$9!#3HD%%i%$%V%i%j$O(BRuby$B$+$i(BC$B%i%$%V%i%j$rMxMQ$9$k$?$a$K$"$k$H$$$C$F(B $B$b$h$$$G$7$g$&!#(B

$B$3$N$h$&$J3HD%%i%$%V%i%j$O%i%C%Q!<%i%$%V%i%j(B(wrapper library)$B$H8F$P$l(B $B$^$9!#$3$l$O(BC$B%i%$%V%i%j$rJq$`(B(wrap$B$9$k(B)$B%i%$%V%i%j$H$$$&0UL#$G$9!#6l$$(B $BLt$r%*%V%i!<%H$GJq$s$G0{$`$h$&$J$b$N$G$9$M!#I.

$B9bB.2=(B

Ruby$B$O%$%s%?%W%j%?$J$N$G!"%3%s%Q%$%i$K$/$i$Y$k$H%W%m%0%i%`$No$KF0E*$J8@8l$J$N$G:GE,2=$N(B $BM>CO$,>/$J$/!"B.EYE*$KITMx$JMW0x$,B?$/$J$C$F$$$^$9!#$b$A$m$s!"(BRuby$B%W%m(B $B%0%i%`$b9)IW$9$k$3$H$K$h$C$F$"$kDxEYB.EY$r>e$2$k$3$H$,$G$-$^$9$,!"$d$O(B $B$j8B3&$,$"$j$^$9!#(B

$B$=$3$G!"$I$&$7$F$bB.EYE*$JLdBj$,$"$k$H$$$&>l9g$K!"3HD%%i%$%V%i%j$r:n@.(B $B$9$k$3$H$K$h$C$F%W%m%0%i%`$N9bB.2=$r?^$k$3$H$,$G$-$^$9!#3HD%%i%$%V%i%j(B $B$O(BC$B$G=q$-$^$9$+$i!"EvA33HD%%i%$%V%i%j$NItJ,$Nl9g$K$h$C$F$O(BRuby$B$G=q$$$?>l9g$H$O$/$i$Y$b$N$K$J$i$J$$$[$I$K9bB.2=(B $B$9$k$3$H$,$G$-$^$9!#(B

$B$?$@!"5$$rIU$1$J$$$H$$$1$J$$$N$O!"2?$G$b$+$s$G$b3HD%%i%$%V%i%j$K$7$F$7(B $B$^$&$H(BRuby$B$r;H$&0UL#$,$J$/$J$C$F$7$^$&$H$$$&$3$H$G$9!#9bB.2=$9$k$?$a$K(B $B3HD%%i%$%V%i%j$r;H$&$N$O!"$I$&$7$F$bI,MW$J>l9g$@$1$K8BDj$7$?J}$,$h$$$G(B $B$7$g$&!#$?$H$($P!"0lIt$N?M!9$O(BRuby$B$r?tCM7W;;$KMxMQ$7$F$$$^$9$,!"$5$9$,(B $B$K$9$Y$F(BRuby$B$G=q$/$H@-G=$KLdBj$,$"$k$?$a!"BgNL$N7W;;$,I,MW$JItJ,$O3HD%(B $B%i%$%V%i%j$G

$B$A$J$_$K8=:_!"(BRuby$B$O$^$D$b$H$5$s$N*1$B$N$G!"(BRuby$B$N@-G=$O:#8eHtLvE*$K8~>e$9$k$+(B $B$b$7$l$^$;$s!#$3$N5-;v$N<9I.;~E@$G$O$^$@Hs>o$K4pK\E*$JItJ,$7$+[2]$B$K$/$i$Y$k$H(B3$BG\$/$i$$CY$$$h$&$G!"$5$i$J$k9bB.2=(B $B$,?J$a$i$l$F$$$^$9!#?tG/8e$K$O(BRuby$B$OCY$$$J$s$FC/$b8@$o$J$/$J$C$F$$$k$+(B $B$b$7$l$^$;$s$M!#(B

$B3HD%%i%$%V%i%j$N9=@.(B

$B$3$3$G!"4JC1$K3HD%%i%$%V%i%j$N9=@.$K$D$$$F@bL@$7$F$*$-$^$7$g$&!#3HD%%i(B $B%$%V%i%j$O0J2<$N$h$&$J%U%!%$%k$K$h$C$F9=@.$5$l$^$9!#(B

extconf.rb

extconf.rb$B$O4D6-$K9g$C$?(BMakefile$B$r@8@.$9$k@_Dj%9%/%j%W%H$G$9!#DL>o!"(B $B3HD%%i%$%V%i%j$rG[I[$9$k>l9g$O!"$+$J$i$:(Bextconf.rb$B$r%"!<%+%$%V$K4^(B $B$a$^$9!#(Bextconf.rb$B$O$X%C%@%U%!%$%k$d%i%$%V%i%j$NB8:_$r%A%'%C%/$7!"(B $BI,MW$J$b$N$,B7$C$F$$$k>l9g$K$@$1(BMakefile$B$r@8@.$7$^$9!#(B

$B%=!<%9%U%!%$%k(B

C$B%i%$%V%i%j$K%"%/%;%9$9$k$?$a$N%a%=%C%I$d%/%i%9$rDj5A$9$k(BC$B$N%=!<%9(B $B%U%!%$%k$G$9!#%=!<%9%U%!%$%k$,0l$D$7$+$J$$>l9g$O!V%i%$%V%i%jL>(B.c$B!W(B $B$H$$$&L>A0$K$7$^$9!#%=!<%9%U%!%$%k$,J#?t$"$k>l9g$O!V%i%$%V%i%jL>(B.c$B!W(B $B$H$$$&%U%!%$%kL>$rIU$1$k$H$^$:$$$N$GCm0U$7$F$/$@$5$$!#(B

depend

Makefile$B$K0MB84X78$rDI2C$9$k$?$a$N%U%!%$%k$G$9!#(Bdepend$B$,B8:_$9$k>l(B $B9g$O!"(Bextconf.rb$B$K$h$C$F(BMakefile$B$,@8@.$5$l$k;~$K!"KvHx$K(Bdepend$B$NFb(B $BMF$,DI2C$5$l$^$9!#$3$N%U%!%$%k$OI,?\$G$O$"$j$^$;$s!#(B

MANIFEST

$B3HD%%i%$%V%i%j$r9=@.$9$k%U%!%$%k$N%j%9%H$r5-=R$7$^$9!#3HD%%i%$%V%i(B $B%j$N%G%#%l%/%H%j$G!"(B

$ find * -type f -print > MANIFEST

$B$H$9$k$3$H$G:n@.$9$k$3$H$,$G$-$^$9!#$3$N%U%!%$%k$O3HD%%i%$%V%i%j$r(B $B%3%s%Q%$%k$9$k;~$K$O$H$/$KMxMQ$5$l$^$;$s$,!"%Q%C%1!<%8%s%0;~$J$I$K(B $BJXMx$J$N$GMQ0U$7$F$*$$$?J}$,$h$$$G$7$g$&!#(B

$B>l9g$K$h$C$F$O$X%C%@%U%!%$%k$rMQ0U$7$?$j!"%G!<%?%U%!%$%k$J$I$rMQ0U$9$k(B $B$3$H$b$"$k$+$b$7$l$^$;$s$,!"$@$$$?$$$3$N$h$&$J9=@.$K$J$C$F$$$^$9!#(B

fnmatch$B3HD%%i%$%V%i%j(B

$B$G$O!"

$B:nNc$K2?$rA*$V$+$GLB$C$?$N$G$9$,!"$A$g$&$I(Bruby-dev$B$G(Bfnmatch(3)$B$N5!G=$r(B Ruby$B$GDs6!$7$F$O$I$&$+!"$H$$$&Ds0F$,$5$l$F$$$^$7$?(B[3]$B$N$G!"(B fnmatch(3)$B$N5!G=$rDs6!$9$k3HD%%i%$%V%i%j$r:n$k$3$H$K$7$^$9!#$R$g$C$H$9(B $B$k$H$_$J$5$s$,$3$N5-;v$rFI$^$l$k:"$K$O!"(Bfnmatch(3)$B$N5!G=$OI8=`$GDs6!$5(B $B$l$F$$$k$+$b$7$l$^$;$s$,!"8=;~E@$G$O$^$@Ds6!$5$l$F$$$^$;$s$N$G!"3HD%%i(B $B%$%V%i%j$rMxMQ$9$k$H$$$&$N$O%j!<%:%J%V%k$JA*Br$G$9!#(B

fnmatch(3)

fnmatch(3)$B$O%7%'%k$N%o%$%k%I%+!<%I$K$h$k%^%C%A%s%0$r9T$&4X?t$G!"B?$/$N(B $B%7%9%F%`$GI8=`$GDs6!$5$l$F$$$^$9!#(B

fnmatch(3)$B$O(Bfnmatch.h$B$H$$$&$X%C%@%U%!%$%k$K0J2<$N$h$&$J%W%m%H%?%$%W@k(B $B8@$r;}$A$^$9!#(B

int fnmatch(const char *pattern, const char *string, int flags);

$BBh(B1$B0z?t(Bpattern$B$O%o%$%k%I%+!<%I%Q%?!<%s$G!"Bh(B2$B0z?t$N(Bstring$B$,%^%C%A%s%0(B $B$NBP>]$H$J$kJ8;zNs$G$9!#Bh(B3$B0z?t$N(Bflags$B$O%^%C%A%s%0=hM}$N5sF0$r;XDj$9$k(B $B$?$a$N%U%i%0$G$9!#(B

$B%^%C%A$7$?>l9g$O(B0$B$r!"%^%C%A$7$J$+$C$?>l9g$O(BFNM_NOMATCH$B$r!"%(%i!<$N>l9g(B $B$O$=$l0J30$NCM$rJV$7$^$9!#(B

$B>\$7$/$O!"(B

$ man 3 fnmatch

$B$H$7$F(Bfnmatch(3)$B$N%^%K%e%"%k$r;2>H$7$F$/$@$5$$!#(B

$B@_7W(B

$B$K(BC$B$HF1$8%$%s%?%U%'%$%9$r$=$N$^$^:NMQ$9$k$3$H(B $B$K$7$^$9!#(B

$B6qBNE*$K$O0J2<$N$h$&$J4X?tIw$N%a%=%C%I(B(print$B$d(Bgets$B$J$I$HF1$8$h$&$K$I$3(B $B$+$i$G$b%l%7!<%P$r>JN,$7$?7A$G8F%Y$k%a%=%C%I(B)$B$rDj5A$9$k$3$H$K$7$^$9!#(B

fnmatch(pattern, string, flags)

pattern$B$K(Bstring$B$,%^%C%A$9$k>l9g(Btrue$B$rJV$7!"%^%C%A$7$J$$>l9g(Bfalse$B$r(B $BJV$9!#%(%i!<$N;~$ONc30$,H/@8$9$k!#(B

$B3HD%%i%$%V%i%j$NL>A0$bC1=c$K(Bfnmatch$B$H$7$^$9!#(B

extconf.rb

$BL5;v$K@_7W$b:Q$s$@(B(?)$B$H$3$m$G!"(Bextconf.rb$B$r:n@.$7$^$9!#(B(List1) mkmf$B$H(B $B$$$&%i%$%V%i%j$r(Brequire$B$7$F$$$^$9$,!"$3$l$O(BMakefile$B$r:n@.$9$k$?$a$KI,(B $BMW$J5!G=$rDs6!$9$k%i%$%V%i%j$G$9!#(Bmkmf$B$G$O0J2<$N$h$&$J%a%=%C%I$,Ds6!$5(B $B$l$^$9!#(B

have_header(header)

$B%X%C%@%U%!%$%k$NB8:_$r%A%'%C%/$9$k!#(B

have_library(lib, func = "main")

$B%i%$%V%i%j$H4X?t$NB8:_$r%A%'%C%/$9$k!#(B

have_func(func, header = nil)

$B4X?t$NB8:_$r%A%'%C%/$9$k!#(B

create_makefile(target)

Makefile$B$r@8@.$9$k!#(B

$B$3$N(Bextconf.rb$B$G$O(Bhave_header$B$G(Bfnmatch.h$B$NB8:_$r%A%'%C%/$7!"(B fnmatch.h$B$,B8:_$9$k>l9g$O(Bcreate_makefile$B$G(BMakefile$B$r:n@.$7$F$$$^$9!#(B create_makefile$B$N0z?t$K$O3HD%%i%$%V%i%j$NL>A0$r;XDj$7$^$9!#(B

-- List1 extconf.rb

  #!/usr/bin/ruby

  require "mkmf"

  if have_header("fnmatch.h")
    create_makefile("fnmatch")
  end

fnmatch.c

$B$5$F!"$$$h$$$h%=!<%9%U%!%$%kK\BN$r:n@.$7$^$9!#(BList2$B$r8+$k$H!"$o$:$+(B25 $B9T$HGo;RH4$1$9$k$/$i$$$KC;$$$N$G!"0lIt$NH4?h$+$H;W$o$l$kJ}$b$$$i$C$7$c(B $B$k$+$b$7$l$^$;$s$,!"$3$l$GA4It$G$9!#3HD%%i%$%V%i%j$N:n@.$HJ9$$$F!"2?$H(B $B$/$J$/Fq$7$=$&$@$H;W$o$l$F$$$?J}$b!"0B?4$5$l$?$N$G$O$J$$$G$7$g$&$+!#(B

-- List2 fnmatch.c

  #include <fnmatch.h>
  #include "ruby.h"

  static VALUE f_fnmatch(VALUE self, VALUE pattern, VALUE string, VALUE flags)
  {
      int ret;

      ret = fnmatch(STR2CSTR(pattern), STR2CSTR(string), NUM2INT(flags));
      switch (ret) {
      case 0:
          return Qtrue;
      case FNM_NOMATCH:
          return Qfalse;
      default:
          rb_raise(rb_eRuntimeError, "error");
      }
  }

  void Init_fnmatch()
  {
      rb_define_global_function("fnmatch", f_fnmatch, 3);
      rb_define_global_const("FNM_NOESCAPE", INT2NUM(FNM_NOESCAPE));
      rb_define_global_const("FNM_PATHNAME", INT2NUM(FNM_PATHNAME));
      rb_define_global_const("FNM_PERIOD", INT2NUM(FNM_PERIOD));
  }

fnmatch.c$B$G$O

f_fnmatch()

f_fnmatch()$B$O(Bfnmatch$B%a%=%C%I$NK\BN$N=hM}$r5-=R$7$F$$$^$9!#$3$N$h$&(B $B$K!"4X?tE*$J%a%=%C%I$NK\BN$rDj5A$9$k4X?tL>$O!V(Bf_$B%a%=%C%IL>!W$H$9$k(B $B$H$$$&47=,$K$J$C$F$$$^$9!#(Bf_$B$H$$$&%W%j%U%#%C%/%9$O(Bfunction$B$r0UL#$7(B $B$^$9!#(B

$BLa$jCM$H0z?t$N7?$O$9$Y$F(BVALUE$B$K$J$C$F$$$^$9$,!"(BRuby$B$N%*%V%8%'%/%H(B $B$O$9$Y$F!"(BC$B$G$O(BVALUE$B$H$$$&7?$K$h$C$FI=8=$5$l$^$9!#3HD%%i%$%V%i%j$G(B $B$OI,MW$K1~$8$F!"(BVALUE$B7?$N%G!<%?$r(Bint$B$J$I$N(BC$B$G07$$$d$9$$%G!<%?$KJQ(B $B49$7$F=hM}$r9T$&$3$H$K$J$j$^$9!#(B

f_fnmatch()$B$O0z?t$r(B4$B$D;}$C$F$$$^$9$,!":G=i$N0z?t$O%a%=%C%I$N%l%7!<(B $B%P$G!";D$j$N(B3$B$D$,%a%=%C%I$N0z?t$G$9!#$3$N>l9g$O4X?tE*$J%a%=%C%I$J(B $B$N$G%l%7!<%P$OMxMQ$7$^$;$s!#(Bpattern$B$H(Bstring$B$O(BSTR2CSTR()$B$H$$$&%^%/(B $B%m$K$h$C$F(Bchar*$B7?$K!"(Bflags$B$O(BNUM2INT()$B$H$$$&%^%/%m$K$h$C$F(Bint$B7?(B $B$KJQ49$7!"$=$l$i$r0z?t$H$7$F(Bfnmatch(3)$B$r8F$S=P$7$F$$$^$9!#(B

$B%^%C%A$7$?>l9g$O(BQtrue$B$r!"%^%C%A$7$J$+$C$?>l9g$O(BQfalse$B$rJV$7$F$$$^(B $B$9$,!"$3$l$i$O$=$l$>$l(BRuby$B$N(Btrue/false$B$rI=$7$^$9!#(Bf_fnmatch()$B$NLa(B $B$jCM$O$=$N$^$^(Bfnmatch$B%a%=%C%I$NLa$jCM$K$J$j$^$9!#%(%i!<;~$K$O(B rb_raise()$B$K$h$C$FNc30$rH/@8$5$;$F$$$^$9!#(Brb_raise()$B$NBh0l0z?t$ONc(B $B30%/%i%9$r;XDj$7!"Bh(B2$B0z?t0J9_$O(Bprintf()$B$HF1$8$h$&$J0z?t$rNc30$K$D(B $B$$$F$N>pJs$H$7$FEO$7$^$9!#$3$3$G$OBh(B1$B0z?t$K(Brb_eRuntimeError$B$rM?$((B $B$F$$$^$9$,!"(Brb_eRuntimeError$B$O(BRuntimeError$B%/%i%9$rI=$9(BVALUE$B7?$N%0(B $B%m!<%P%kJQ?t$G!"(Bruby.h$B$G@k8@$5$l$F$$$^$9!#(BRuby$B$G$O%/%i%9$b%*%V%8%'(B $B%/%H$J$N$G!"(BVALUE$B7?$GI=8=$5$l$^$9!#(B

Init_fnmatch()

Init_fnmatch()$B$O3HD%%i%$%V%i%j$N=i4|2=$r9T$&4X?t$G$9!#3HD%%i%$%V%i(B $B%j$,%m!<%I$5$l$k;~$K$O!V(BInit_$B%i%$%V%i%jL>!W$H$$$&L>A0$N4X?t$,<+F0(B $BE*$K8F$P$l$^$9!#(B

Init_fnmatch()$B$G9T$C$F$$$k$N$O!"(Bfnmatch$B%a%=%C%I$NDj5A$H!"(B3$B$D$N%0%m(B $B!<%P%kDj?t$NDj5A$G$9!#(Brb_define_global_function()$B$O(Bprint$B$N$h$&$J%0(B $B%m!<%P%k4X?tIw$N%a%=%C%I$NDj5A$r9T$$$^$9!#Bh(B1$B0z?t$O%a%=%C%IL>!"Bh(B2 $B0z?t$O!"Bh(B2$B0z?t$ODj?t$NCM$G$9!#$3$3$G(B $B$O(Bfnmatch$B%a%=%C%I$NBh(B3$B0z?t$KMxMQ$9$k$?$a$N%U%i%0$rDj5A$7$F$$$^$9!#(B INT2NUM()$B$H$$$&%^%/%m$rMxMQ$7$F$$$^$9$,!"$3$l$O(BNUM2INT()$B$HH?BP$K(B int$B7?$N%G!<%?$r(BVALUE$B7?$N(BRuby$B%*%V%8%'%/%H$KJQ49$7$^$9!#(B

$B$3$N3HD%%i%$%V%i%j$OHs>o$K5,LO$N>.$5$$$b$N$G$9$,!"Bg5,LO$J3HD%%i%$%V%i(B $B%j$r:n@.$9$k>l9g$b4pK\E*$K$OF1$8$h$&$J9=@.$K$J$j$^$9!#3HD%%i%$%V%i%j$N(B $B=i4|2=$O$+$J$i$:!V(BInit_$B%i%$%V%i%jL>!W$H$$$&L>A0$N4X?t$G9T$o$l$k$N$G!"(B $B!V(BInit_$B%i%$%V%i%jL>!W$r8+$l$P$=$N3HD%%i%$%V%i%j$,$I$N$h$&$J%$%s%?%U%'(B $B%$%9$rDs6!$7$F$$$k$N$+$rCN$k$3$H$,$G$-$^$9!#3HD%%i%$%V%i%j$N%=!<%9$rFI(B $B$`>l9g$O!"$^$:!V(BInit_$B%i%$%V%i%jL>!W4X?t$+$iFI$_;O$a$k$H$h$$$G$7$g$&!#(B

$B%$%s%9%H!<%k(B

$B$5$F!"$G$O$3$N3HD%%i%$%V%i%j$r%$%s%9%H!<%k$7$F$_$^$7$g$&!#%$%s%9%H!<%k(B $B$N

$ ruby extconf.rb
$ make
# make site-install

site-install$B$H$$$&%?!<%2%C%H$r;H$&$H!"3HD%%i%$%V%i%j$O(Bsocket$B$J$I$NI8=`(B $BE:IU%i%$%V%i%j$H$OJL$N3F%5%$%HMQ$N%G%#%l%/%H%j$K%$%s%9%H!<%k$5$l$^$9!#(B $BI8=`E:IU%i%$%V%i%j$HF1$8>l=j$K%$%s%9%H!<%k$7$?$$>l9g$OBe$j$K(Binstall$B$H(B $B$$$&%?!<%2%C%H$rMxMQ$7$F$/$@$5$$!#(BDebian GNU/Linux$B$N$h$&$J%P%$%J%j%Q%C(B $B%1!<%8$,@0Hw$5$l$?4D6-$G$O!"

$B%5%s%W%k%W%m%0%i%`(B

List3$B$O(Bfnmatch$B%i%$%V%i%j$rMxMQ$7$?%5%s%W%k%W%m%0%i%`$G$9!#I8=`F~NO$d(B $B%U%!%$%k$N3F9T$rFI$_9~$_!"%3%^%s%I%i%$%s0z?t$G;XDj$5$l$?%o%$%k%I%+!<%I(B $B$K%^%C%A$7$?9T$N$_=PNO$9$k%W%m%0%i%`$G$9!#(Bgrep$B$N%o%$%k%I%+!<%IHG$J$N$G!"(B re(regular expression)$B$r(Bwc(wildcard)$B$KJQ$($F!"(Bgwcp.rb$B$H$$$&L>A0$K$7$^(B $B$7$?!#(B($B%5%6%($5$s$N$7$c$C$/$j$N$h$&$KH/2;$7$F$/$@$5$$!#(B)

-- List3 gwcp.rb

  #!/usr/bin/ruby

  require "fnmatch"

  pattern = ARGV.shift
  unless pattern
    $stderr.printf("usage: %s <pattern> [files...]\n", $0)
    exit 1
  end
  while line = gets
    line.chomp!
    if fnmatch(pattern, line, 0)
      puts line
    end
  end

$B$[$H$s$I@bL@$NI,MW$,$J$$$/$i$$4JC1$J%9%/%j%W%H$G$9$,!"(Bline.chomp!$B$H$7(B $B$F$$$kE@$KCm0U$7$F$/$@$5$$!#(Bchomp!$B$OJ8;zNs$N:G8e$N2~9T%3!<%I$r

Fig1$B$O(Bgwcp.rb$B$N

-- Fig1 gwcp.rb$B$N

$B:G8e$K(B

$B$5$F!"$3$l$G$^$:$OF0:n$9$k3HD%%i%$%V%i%j$r:n@.$9$k$3$H$,$G$-$^$7$?!#;W$C(B $B$?$h$j4JC1$@$C$?$N$G$O$J$$$G$7$g$&$+!#(B

$B$7$+$7!":#2s:n@.$7$?(Bfnmatch$B%i%$%V%i%j$N@_7W$O$*@$<-$K$b$h$$$H8@$($k$b(B $B$N$G$O$"$j$^$;$s!#(B($B$O$C$-$j8@$C$F$7$^$&$H%@%5$$$G$9!#(B) $B$3$l$K$OM}M3$,(B $B$"$j$^$9!#[email protected]$r:n$C$F$7$^$&$H%M%?$,$J$/$J$k$+$i!"$G$O(B $B$J$/$F!"4JC1$J$3$H$+$i$O$8$a$F!"CJ3,E*$K%9%F%C%W%"%C%W$7$F$$$C$?J}$,$o(B $B$+$j$d$9$$$H;W$&$+$i$G$9!#(B

$B$H$$$&$o$1$G!"/$73HD%(B $B%i%$%V%i%j$N:n@.$K$D$$$F@bL@$7$^$9!#(B

$B$=$l$G$O!"(BHappy hacking!

$B;29M(BURL

[1]

"Re: Concurrent Programming in Java", [email protected] <URL:http://www.shugo.net/news/fj.comp.oops/19970219-27.txt>

[2]

"QScheme", Daniel Crettol <URL:http://www.sof.ch/dan/qscheme/index-e.html>

[3]

"[ruby-dev:12197] String#fnmatch", Akinori MUSHA <URL:http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/12197>


*1 $B8=:_$N%$%s%?%W%j%?$G$O9=J8LZ$r:F5"E*$KC)$C$F