Mercurial > hg > Papers > 2019 > ikki-sigos
changeset 14:15f8718f263d
last pushed
author | ichikitakahiro <e165713@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 09 May 2019 20:51:09 +0900 |
parents | 92be9b32ce4e |
children | 343c08791caa |
files | paper/ipsjpref.sty paper/ipsjsort-e.bst paper/ipsjsort.bst paper/ipsjunsrt-e.bst paper/ipsjunsrt.bst paper/sigos.bib paper/sigos.pdf paper/sigos.tex |
diffstat | 8 files changed, 5554 insertions(+), 255 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/ipsjpref.sty Thu May 09 20:51:09 2019 +0900 @@ -0,0 +1,374 @@ + +% ipsjpref.sty (C) 2012 Information Processing Society of Japan +% Copyright (C) 1995-2010 by Hiroshi Nakashima, Yasuki Saito and +% The Editorial Board of the IPSJ Journal + + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{ipsj} +%\ProvidesClass{ipsj} +% [2011/12/10-2012/03/09 v1.00-2.00 IPSJPREF.STY] +% [2012/06/01 v2.01 IPSJPREF.STY] + [2017/02/16 v3.00 IPSJ class] + + + + +\newif\ifDS@alone \DS@alonefalse +\DeclareOption{alone}{\DS@alonetrue} +\ProcessOptions + + +\def\SHUBETUname@DAM{\ifDS@english% +\leavevmode %%<--- +\else \leavevmode \fi}%% + + +\JEhonbunsep=5mm % default 15mm + + +\def\@maketitle{% +\newpage\null +%%%%%%%%%% +\ifDS@english +%% +\vskip-1.3mm% +\ifx\SHUBETUname\relax% +{\SHUBETUfontE{\SHUBETUname@DEF}}%% +\else +{\SHUBETUfontE{\SHUBETUname}}%% +\fi +%% +\else +\ifx\SHUBETUname\relax% +{\SHUBETUfontJ{\SHUBETUname@DEF}}%% +\else +{\SHUBETUfontJ{\SHUBETUname}}%% +\fi\fi +%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%% +\vskip\shubetutitlesep% +%%%%%%%%%%%%%%%%%%%%%%%% +%% +%\vskip 10mm% +\begin{center} +\authortitle %%<--- +\end{center} +%%%%%%%%%%%%%%%%%%% +% +} + + + +\ifDS@english +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\def\authortitle{% +{\Engtitlefont% +{\@title}\par} +%%%%%%%%%%%%%%%%%%%%%%% +\vskip\Etitleauthorsep% +%%%%%%%%%%%%%%%%%%%%%%% +%% author %%% +{\Engeauthorfont% +\authoroutput{e}\par}% +%%%%%%%%%%%%%%%%%%%%%%%%% +\vskip\Eauthorreceivesep% +%%%%%%%%%%%%%%%%%%%%%%%%% +\vskip\JEhonbunsep% +%%%%%%%%%%%%%%%%%%% +%% +} +%=========== +\else +%========== +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\def\authortitle{% +{\jtitlefont% +{\@title}\par}% +%%%%%%%%%%%%%%%%%%%%%%%% +\vskip\Jtitlejauthorsep% +%%%%%%%%%%%%%%%%%%%%%%%% +%====== +{\authorfont% +\authoroutput{}\par}% +%%%%%%%%%%%%%%%%%%%%%%%%%% +\vskip\Jauthorjreceivesep% +%%%%%%%%%%%%%%%%%%%%%%%%%% +\vskip\JEhonbunsep% +%%%%%%%%%%%%%%%%%%% +} +\fi + + + + + + + +\ifDS@english +\def\ps@IPSJTITLEheadings{% + \def\@oddhead{\@Ltop% +\rlap{\small{%% +%% +\ifx\signame\relax% +{\HeadfontE{\signame@DEF}}%% +\else +{\HeadfontE{\signame}}%% +\fi +%%%%% +%vol +%%%%% +%=============== +\hskip12\Q{\HeadfontE{Vol.\number\c@volume}}% +%=============== + \ifDS@CVA\relax\else + \ifDS@TBIO\relax\else + \ifDS@SLDM\relax\else +% \ifDS@JIP\relax\else +%%%%%% +%no +%%%%%% +%\hskip1em{\HeadfontE{No.\number\c@number}}% +\fi\fi\fi%\fi +%%%%%% +%page +%%%%%% +\bgroup +%%% +% +\ifDS@ACS + \ifDS@alone + \hskip12\Q{\HeadfontE{\pageref{ipsj@firstpage}}}\ % + \HeadfontE{(\@monthyear)}% + \else + \hskip12\Q{\HeadfontE{\pageref{ipsj@firstpage}--\pageref{ipsj@lastpage}}}\ % + \HeadfontE{(\@monthyear)}% + \fi +\else\relax\fi +% +\ifDS@PRO + \ifDS@alone + \hskip12\Q{\HeadfontE{\pageref{ipsj@firstpage}}}\ % + \HeadfontE{(\@monthyear)}% + \else + \hskip12\Q{\HeadfontE{\pageref{ipsj@firstpage}--\pageref{ipsj@lastpage}}}\ % + \HeadfontE{(\@monthyear)}% + \fi +\else\relax\fi +% +\ifDS@TOD + \ifDS@alone + \hskip12\Q{\HeadfontE{\pageref{ipsj@firstpage}}}\ % + \HeadfontE{(\@monthyear)}% + \else + \hskip12\Q{\HeadfontE{\pageref{ipsj@firstpage}--\pageref{ipsj@lastpage}}}\ % + \HeadfontE{(\@monthyear)}% + \fi +\else\relax\fi +% +\ifDS@TOM + \ifDS@alone + \hskip12\Q{\HeadfontE{\pageref{ipsj@firstpage}}}\ % + \HeadfontE{(\@monthyear)}% + \else + \hskip12\Q{\HeadfontE{\pageref{ipsj@firstpage}--\pageref{ipsj@lastpage}}}\ % + \HeadfontE{(\@monthyear)}% + \fi +\else\relax\fi +% +\ifDS@TBIO + \ifDS@alone + \hskip12\Q{\HeadfontE{\pageref{ipsj@firstpage}}}\ % + \HeadfontE{(\@monthyear)}% + \else + \hskip12\Q{\HeadfontE{\pageref{ipsj@firstpage}--\pageref{ipsj@lastpage}}}\ % + \HeadfontE{(\@monthyear)}% + \fi +\else\relax\fi +% +\ifDS@CVA + \ifDS@alone + \hskip12\Q{\HeadfontE{\pageref{ipsj@firstpage}}}\ % + \HeadfontE{(\@monthyear)}% + \else + \hskip12\Q{\HeadfontE{\pageref{ipsj@firstpage}--\pageref{ipsj@lastpage}}}\ % + \HeadfontE{(\@monthyear)}% + \fi +\else\relax\fi +% +\ifDS@SLDM + \ifDS@alone + \hskip12\Q{\HeadfontE{\pageref{ipsj@firstpage}}}\ % + \HeadfontE{(\@monthyear)}% + \else + \hskip12\Q{\HeadfontE{\pageref{ipsj@firstpage}--\pageref{ipsj@lastpage}}}\ % + \HeadfontE{(\@monthyear)}% + \fi +\else\relax\fi +% +%\ifDS@JIP +% \hskip12\Q{\HeadfontE{\pageref{ipsj@firstpage}--\pageref{ipsj@lastpage}}}\ % +% \HeadfontE{(\@monthyear)}% +%\else\relax\fi +\ifDS@JIP + \ifDS@alone + \hskip12\Q{\HeadfontE{\pageref{ipsj@firstpage}}}\ % + \HeadfontE{(\@monthyear)}% + \else + \hskip12\Q{\HeadfontE{\pageref{ipsj@firstpage}--\pageref{ipsj@lastpage}}}\ % + \HeadfontE{(\@monthyear)}% + \fi +\else\relax\fi +% +\ifDS@CDS + \ifDS@alone + \hskip12\Q{\HeadfontE{\pageref{ipsj@firstpage}}}\ % + \HeadfontE{(\@monthyear)}% + \else + \hskip12\Q{\HeadfontE{\pageref{ipsj@firstpage}--\pageref{ipsj@lastpage}}}\ % + \HeadfontE{(\@monthyear)}% + \fi +\else\relax\fi +% +%\ifDS@EEE +% \hskip12\Q{\HeadfontE{\pageref{ipsj@firstpage}}}\ % +% \HeadfontE{(\@monthyear)}% +%\else\relax\fi +% +% +% +%%% +\egroup +}% +}% +%%%%% +\smash{\raisebox{-6mm}{\rlap{% +{\DOIHeadfont% +%%%% +\bgroup +\ifDS@TBIO + [DOI: 10.2197/ipsjtbio.\number\c@volume.\pageref{ipsj@firstpage}] +\else\fi +% +\ifDS@CVA + [DOI: 10.2197/ipsjtcva.\number\c@volume.\pageref{ipsj@firstpage}] +\else\fi +% +\ifDS@SLDM + [DOI: 10.2197/ipsjtsldm.\number\c@volume.\pageref{ipsj@firstpage}] +\else\fi +% +\ifDS@JIP + [DOI: 10.2197/ipsjjip.\number\c@volume.\pageref{ipsj@firstpage}] +\else\fi +% +%% +%% +%%%%% +\egroup +}% +}}}% +\hfil\@Rtop}% +%%%%% + \let\@evenhead\@oddhead + \def\@oddfoot{\@Lbot% +\rlap{%\fontsize{10\Q}{0\h}% +%\usefont{OT1}{ptm}{m}{n}%Times +%\selectfont% +%\normalfont% +{\bothashira% +\copyright \ {\@footyear} Information Processing Society of Japan% +}}% +\hfil +%\fontsize{13\Q}{0\h}% +%\usefont{OT1}{ptm}{m}{n}%Times +%\selectfont% +%\normalsize +{\botnomble +%%%%%% +\ifDS@ACS{\thepage}\else\fi +\ifDS@PRO{\thepage}\else\fi +\ifDS@TOD{\thepage}\else\fi +\ifDS@TOM{\thepage}\else\fi +\ifDS@TBIO{\thepage}\else\fi +\ifDS@CVA{\thepage}\else\fi +\ifDS@SLDM{\thepage}\else\fi +\ifDS@JIP{\thepage}\else\fi +\ifDS@CDS{\thepage}\else\fi +%\ifDS@EEE{\thepage}\else\fi +%%%%% +\@Rbot}% + \let\@evenfoot\@oddfoot + \let\@mkboth\@gobbletwo +}} +%%% +%%%%%%%%% +\else +%%%%%%%%% +%%% +\def\ps@IPSJTITLEheadings{% + \def\@oddhead{\@Ltop% +\rlap{\small% +%% +\ifx\signame\relax% +{\HeadfontJ{\signame@DEF}}%% +\else +{\HeadfontJ{\signame}}%% +\fi +%%%%% +{%% +\hskip12\JQ{\HeadfontE{Vol.\number\c@volume}}% +%\hskip12\JQ{\HeadfontE{No.\number\c@number}}% +% +\ifDS@alone +\hskip12\JQ{\HeadfontE{\pageref{ipsj@firstpage}}}\ % +\HeadfontE{(\@monthyear)}% +\else +% +\hskip12\JQ{\HeadfontE{\pageref{ipsj@firstpage}--\pageref{ipsj@lastpage}}}\ % +\HeadfontE{(\@monthyear)} +\fi +}}% +%%%% +\smash{\raisebox{-6mm}{\rlap{% +{\DOIHeadfont%% +}% +}}}% +\hfil\@Rtop}% +%% + \let\@evenhead\@oddhead + \def\@oddfoot{\@Lbot% +\rlap{% +%\fontsize{10\Q}{0\h}\usefont{OT1}{ptm}{m}{n}%Times +%\selectfont% +{\bothashira% +{\textcopyrighttx} \ {\@footyear} Information Processing Society of Japan% +}}% +\hfil% +%\fontsize{13\Q}{0\h}% +%\usefont{OT1}{ptm}{m}{n}%Times +%\selectfont% +{\botnomble% +{\thepage}}% +\@Rbot}% + \let\@evenfoot\@oddfoot + \let\@mkboth\@gobbletwo +} +\fi + + + + +%% <<<< v1.02 +\def\SHUBETUname@Data{\leavevmode\phantom{Database/Software Paper}} +\def\SHUBETUname@Survey{\leavevmode\phantom{Survey Paper}} +\def\SHUBETUname@TBIOM{\leavevmode\phantom{Original Paper}} +\def\SHUBETUname@Short{\leavevmode\phantom{Short Paper}} + + + + + +\endinput + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/ipsjsort-e.bst Thu May 09 20:51:09 2019 +0900 @@ -0,0 +1,1248 @@ +% ipsjsort-e.bst 28-Oct-10 by Hiroshi Nakashima (ver 3.00) +% ipsjsort-e.bst 15-Jun-07 by Hiroshi Nakashima (ver 2.12) +% ipsjsort.bst 30-Jan-02 by Hiroshi Nakashima (ver 2.00) +% ipsjsort.bst 28-Dec-93 by Hiroshi Nakashima (ver 1.00) +% jssst.bst tomura@etl.go.jp (Satoru Tomura) +% BibTeX standard bibliography style `jplain' + % version 0.10 for JBibTeX versions 0.10 or later, JLaTeX version 2.09. + % by Shouichi Matsui, matsui@denken.junet + +ENTRY + { address + author + booktitle + chapter + doi % 3.00(1) + edition + editor + howpublished + institution + journal + key + month + note + number + organization + pages + publisher + refdate % 3.00(1) + school + series + title + type + url % 3.00(1) + volume + year + } + {} + { label } + +INTEGERS { output.state before.all mid.sentence after.sentence after.block } + +INTEGERS { before.year } + +FUNCTION {init.state.consts} +{ #0 'before.all := + #1 'mid.sentence := + #2 'after.sentence := + #3 'after.block := + #4 'before.year := % 1.00(1) +} + +STRINGS { s t } + +FUNCTION {output.nonnull} +{ 's := + output.state mid.sentence = + { ", " * write$ } + { output.state after.block = + { add.period$ write$ + newline$ + "\newblock " write$ + } + { output.state before.all = + 'write$ + { output.state before.year = % 1.00(1) + { " " * write$ } + { add.period$ " " * write$ } + if$ + } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} + +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} + +FUNCTION {required.argument} +{ 't := + empty$ + {"Missing required argument " t * " in " * cite$ * warning$} + 'skip$ + if$ +} + +FUNCTION {required.exclusive.or.argument} +{ 't := + empty$ + { 's := + empty$ + { t " or " * s * " is missing in " * cite$ * warning$} + 'skip$ + if$ + } + { 's := + empty$ + 'skip$ + { "You can use only one of " t * " and " * s * " in " * cite$ * warning$} + if$ + } + if$ +} + +FUNCTION {required.and.or.argument} +{ 't := empty$ + { 's := empty$ + { "there's no " t * " and/or " * s * cite$ * warning$ } + 'skip$ + if$ + } + { pop$ pop$ } + if$ +} + +FUNCTION {optional.series.volume.number.argument} +{ series empty$ + { volume empty$ + { number empty$ + 'skip$ + { "there's a number but no series in " cite$ * warning$ } + if$ + } + { number empty$ + { "there's a volume but no series in " cite$ * warning$ } + { "you can use only one of volume and number in " cite$ * warning$} + if$ + } + if$ + } + { volume empty$ + { number empty$ + { "there's a series but neither volume nor number in " cite$ * warning$ } + 'skip$ + if$ + } + { number empty$ + 'skip$ + { "you can use only one of volume and number in " cite$ * warning$ } + if$ + } + if$ + } + if$ +} + +FUNCTION {output.bibitem} +{ newline$ + "\bibitem{" write$ + cite$ write$ + "}" write$ + newline$ + before.all 'output.state := +} + +FUNCTION {fin.entry} +{ add.period$ + write$ + newline$ +} + +FUNCTION {new.block} +{ output.state before.all = + 'skip$ + { after.block 'output.state := } + if$ +} + +FUNCTION {new.sentence} +{ output.state after.block = + 'skip$ + { output.state before.all = + 'skip$ + { after.sentence 'output.state := } + if$ + } + if$ +} + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} + +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} + +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} + +FUNCTION {new.block.checka} +{ empty$ + 'skip$ + 'new.block + if$ +} + +FUNCTION {new.block.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.block + if$ +} + +FUNCTION {new.sentence.checka} +{ empty$ + 'skip$ + 'new.sentence + if$ +} + +FUNCTION {new.sentence.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.sentence + if$ +} + +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} + +FUNCTION {emphasize} +{ duplicate$ empty$ + { pop$ "" } + { "{\em " swap$ * "}" * } + if$ +} + +INTEGERS { nameptr namesleft numnames } + +FUNCTION {format.names} % 1.00(4), 2.00(4) +{ 's := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr "{vv }{ll}{, jj}{, f.}" format.name$ 't := + nameptr #1 > + { namesleft #1 > + { ", " * t * } + { t "others" = + {" et al." * } + {" and " * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {format.authors} +{ author empty$ + { "" } + { author format.names } + if$ +} + +FUNCTION {add.colon} % 2.00(5) +{ ": " * +} + +FUNCTION {format.editors.inparen} % 2.00(6) +{ editor empty$ + { "" } + { editor format.names + editor num.names$ #1 > + {", eds." *} + {", ed." *} + if$ + } + if$ +} + +FUNCTION {format.editors} +{ editor empty$ + { "" } + { editor format.names + editor num.names$ #1 > + {"(eds.)" *} + {"(ed.)" *} + if$ + } + if$ +} + +FUNCTION {n.dashify} +{ 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + } + { { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + +FUNCTION {format.date} +{ before.year 'output.state := % 1.00(1) + year empty$ + { month empty$ + { "" } + { "there's a month but no year in " cite$ * warning$ + "" % 1.00(5) + } + if$ + } + { "(" year ")" * * } % 1.00(5) + if$ +} + +FUNCTION {format.ref.date} % 3.00(1)>> +{ before.year 'output.state := + "\refdatee{" refdate "}" * * +} % 3.00(1)<< + +FUNCTION {tie.or.space.connect} +{ duplicate$ text.length$ #3 < + { "~" } + { "\ " } % 1.00(6) + if$ + swap$ * * +} + +FUNCTION {output.volume} +{ + volume empty$ + 'skip$ + { "Vol.~" volume * output} + if$ + +} + +FUNCTION {output.number} +{ + number empty$ + 'skip$ + { "No.~" number * output} + if$ +} + +FUNCTION {output.series.volume.number} +{ series empty$ + { output.volume + output.number } + { series output + output.volume + output.number } + if$ +} + +FUNCTION {format.edition} +{ edition empty$ + { "" } + { output.state mid.sentence = + { edition "l" change.case$ " edition" * } + { edition "t" change.case$ " edition" * } + if$ + } + if$ +} + +INTEGERS { multiresult } + +FUNCTION {multi.page.check} +{ 't := + #0 'multiresult := + { multiresult not + t empty$ not + and + } + { t #1 #1 substring$ + duplicate$ "-" = + swap$ duplicate$ "," = + swap$ "+" = + or or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + multiresult +} + +FUNCTION {format.online} % 3.00(1)>> +{ duplicate$ empty$ + { "(online)" * } + { " (online)" * } + if$ +} % 3.00(1)<< + +FUNCTION {format.url} % 3.00(1)>> +{ "\urle{" url "}" * * +} % 3.00(1)<< + +FUNCTION {format.pages} % 1.00(7) +{ pages empty$ + { "" } + { pages multi.page.check + { "pp." pages n.dashify tie.or.space.connect } + { "p." pages tie.or.space.connect } + if$ + } + if$ +} + +FUNCTION {format.doi.url} % 3.00(1)>> +{ doi empty$ + { url empty$ + 'skip$ + { format.online output.nonnull + format.url + } + if$ + } + { format.online output.nonnull + "\doi{" doi "}" * * + } + if$ % 3.00(1)<< +} + +FUNCTION {format.pages.output} % 3.00(1)>> +{ format.pages + format.doi.url output % 3.00(1)<< +} + +FUNCTION {format.vol.num.pages} % 1.00(8) +{ volume empty$ + { ""} + { " Vol.~" volume * } + if$ + number empty$ + 'skip$ + { volume empty$ + { "there's a number but no volume in " cite$ * warning$ } + { "," *} + if$ + " No.~" number * * + } + if$ + pages empty$ + 'skip$ + { duplicate$ empty$ + { pop$ format.pages } + { ", " * format.pages * } + if$ + } + if$ + format.doi.url % 3.00(1) +} + +FUNCTION {format.chapter.pages} +{ chapter empty$ + 'format.pages + { type empty$ + { "chapter" chapter tie.or.space.connect } + { type "l" change.case$ chapter tie.or.space.connect } + if$ + pages empty$ + 'skip$ + { ", " * format.pages * } + if$ + } + if$ + format.doi.url % 3.00(1) +} + +FUNCTION {format.in.ed.booktitle} +{ booktitle empty$ + { "" } + { booktitle emphasize + editor empty$ + 'skip$ + { " (" * format.editors.inparen * ")" *} % 1.00(9), 2.00(6) + if$ + } + if$ +} + +FUNCTION {empty.misc.check} +{ author empty$ title empty$ howpublished empty$ + month empty$ year empty$ note empty$ + and and and and and + key empty$ not and + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ +} + +FUNCTION {format.thesis.type} +{ type empty$ + 'skip$ + { pop$ + type "t" change.case$ + } + if$ +} + +FUNCTION {format.tr.number} +{ type empty$ + { "Technical Report" } + {type} + if$ + number empty$ + { "t" change.case$ } + { " " number * * } + if$ +} + +FUNCTION {format.article.crossref} % 2.00(8) +{ key empty$ + { journal empty$ + { "need key or journal for " cite$ * " to crossref " * crossref * + warning$ + "" + } + { journal emphasize } % 1.00(10) + if$ + } + { "In " key * } + if$ + " \cite{" * crossref * "}" * +} + +FUNCTION {format.crossref.editor} % 1.00(11) +{ editor #1 "{vv }{ll}" format.name$ + editor num.names$ duplicate$ + #2 > + {pop$ " et al." * } + { #2 < + 'skip$ + { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = + {" et al." * } + {" and " * editor #2 "{vv }{ll}" format.name$ * } + if$ + } + if$ + } + if$ +} + +FUNCTION {format.book.crossref} % 2.00(8) +{ editor empty$ + editor field.or.null author field.or.null = + or + { key empty$ + { series empty$ + { "need editor, key, or series for " cite$ * " to crossref " * + crossref * warning$ + "" + } + { series emphasize } % 1.00(10) + if$ + } + { "In " key * } + if$ + } + { format.crossref.editor } + if$ + " \cite{" * crossref * "}" * + volume empty$ + { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ } + { * "Vol." * volume tie.or.space.connect } + if$ +} + +FUNCTION {format.incoll.inproc.crossref} % 2.00(8) +{ editor empty$ + editor field.or.null author field.or.null = + or + { key empty$ + { booktitle empty$ + { "need editor, key, or booktitle for " cite$ * " to crossref " * + crossref * warning$ + "" + } + { booktitle emphasize } % 1.00(10) + if$ + } + { "In " key * } + if$ + } + { format.crossref.editor } + if$ + " \cite{" * crossref * "}" * +} + +FUNCTION {article} +{ +%%%% + author "author" required.argument + title "title" required.argument + journal "journal" required.argument + year "year" required.argument +%%%% jssst + volume "volume" + number "number" + required.and.or.argument + pages "pages" required.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output + crossref missing$ + { journal emphasize output + format.vol.num.pages output % 1.00(12) + format.date output + } + { format.article.crossref output.nonnull + format.pages.output % 3.00(1) + } + if$ + new.block + note output + fin.entry +} + +FUNCTION {book} +{ +%%%% + author "author" + editor "editor" + required.exclusive.or.argument + title "title" required.argument + publisher "publisher" required.argument + year "year" required.argument + optional.series.volume.number.argument +%%%% + output.bibitem + author empty$ + { format.editors} + { format.authors} + if$ + add.colon % 2.00(5) + title emphasize output + crossref missing$ + { output.series.volume.number + publisher output + address output + } + { new.block + format.book.crossref output.nonnull + } + if$ + format.edition output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {booklet} +{ +%%%% + title "title" required.argument +%%%% jssst + author "author" required.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output + howpublished output + address output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {inbook} +{ +%%%% + author "author" + editor "editor" + required.exclusive.or.argument + title "title" required.argument + chapter "chapter" + pages "pages" + required.and.or.argument + publisher "publisher" required.argument + year "year" required.argument + + optional.series.volume.number.argument +%%%% + output.bibitem + author empty$ + { format.editors} + { format.authors} + if$ + add.colon % 2.00(5) + title emphasize output + crossref missing$ + { output.series.volume.number + format.chapter.pages output + publisher output + } + { format.chapter.pages output + new.block + format.book.crossref output.nonnull + } + if$ + format.edition output + format.date output % 1.00(13) + new.block + note output + fin.entry +} + +FUNCTION {incollection} +{ +%%%% + author "author" required.argument + title "title" required.argument + booktitle "booktitle" required.argument + publisher "publisher" required.argument + year "year" required.argument + + optional.series.volume.number.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output + crossref missing$ + { format.in.ed.booktitle output + output.series.volume.number + publisher output + address output + format.edition output + format.chapter.pages output % 1.00(13) + format.date output + } + { format.incoll.inproc.crossref output.nonnull + format.chapter.pages output + } + if$ + new.block + note output + fin.entry +} + +FUNCTION {inproceedings} +{ +%%%% + author "author" required.argument + title "title" required.argument + year "year" required.argument + + optional.series.volume.number.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output + crossref missing$ + { format.in.ed.booktitle output + booktitle "booktitle" required.argument + output.series.volume.number + address output + organization output + publisher output + format.pages.output % 3.00(1) + format.date output % 1.00(13) + } + { format.incoll.inproc.crossref output.nonnull + format.pages.output % 3.00(1) + } + if$ + new.block + note output + fin.entry +} + +FUNCTION {conference} { inproceedings } + +FUNCTION {manual} +{ +%%%% + title "title" required.argument +%%%% jssst + author "author" + organization "organazaion" + required.exclusive.or.argument +%%%% + output.bibitem + author empty$ + { organization} + { format.authors} + if$ + add.colon % 2.00(5) + title emphasize output + author empty$ + 'skip$ + { organization output } + if$ + address output + format.edition output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {mastersthesis} +{ +%%%% + author "author" required.argument + title "title" required.argument + school "school" required.argument + year "year" required.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output + "Master's thesis" + format.thesis.type output.nonnull + school output + address output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {misc} +{ +%%%% +%%%% jssst + author "author" required.argument + title "title" required.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output + howpublished output + format.date output + new.block + note output + fin.entry + empty.misc.check +} + +FUNCTION {phdthesis} +{ +%%%% + author "author" required.argument + title "title" required.argument + school "school" required.argument + year "year" required.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output % 2.00(9) + "PhD Thesis" + format.thesis.type output.nonnull + school output + address output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {proceedings} +{ +%%%% + title "title" required.argument + year "year" required.argument + + optional.series.volume.number.argument +%%%% jssst + editor "editor" + organization "organization" + required.exclusive.or.argument +%%%% + output.bibitem + editor empty$ + { organization } + { format.editors } + if$ + add.colon % 2.00(5) + title emphasize output + output.series.volume.number + address output + editor empty$ + 'skip$ + { organization output } + if$ + publisher output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {techreport} +{ +%%%% + author "author" required.argument + title "title" required.argument + institution "institution" required.argument + year "year" required.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output + format.tr.number output.nonnull + institution output + address output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {unpublished} +{ +%%%% + author "author" required.argument + title "title" required.argument + note "note" required.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {webpage} % 3.00(1)>> +{ +%%%% + author "author" required.argument + title "title" required.argument + url "url" required.argument + refdate "refdate" required.argument +%%%% + output.bibitem + format.authors add.colon + title output + organization format.doi.url output + format.ref.date output + new.block + note output + fin.entry +} % 3.00(1)<< + +FUNCTION {default.type} { misc } + +MACRO {jan} {"January"} + +MACRO {feb} {"February"} + +MACRO {mar} {"March"} + +MACRO {apr} {"April"} + +MACRO {may} {"May"} + +MACRO {jun} {"June"} + +MACRO {jul} {"July"} + +MACRO {aug} {"August"} + +MACRO {sep} {"September"} + +MACRO {oct} {"October"} + +MACRO {nov} {"November"} + +MACRO {dec} {"December"} + +MACRO {acmcs} {"ACM Computing Surveys"} + +MACRO {acta} {"Acta Informatica"} + +MACRO {cacm} {"Communications of the ACM"} + +MACRO {ibmjrd} {"IBM Journal of Research and Development"} + +MACRO {ibmsj} {"IBM Systems Journal"} + +MACRO {ieeese} {"IEEE Transactions on Software Engineering"} + +MACRO {ieeetc} {"IEEE Transactions on Computers"} + +MACRO {ieeetcad} + {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"} + +MACRO {ipl} {"Information Processing Letters"} + +MACRO {jacm} {"Journal of the ACM"} + +MACRO {jcss} {"Journal of Computer and System Sciences"} + +MACRO {scp} {"Science of Computer Programming"} + +MACRO {sicomp} {"SIAM Journal on Computing"} + +MACRO {tocs} {"ACM Transactions on Computer Systems"} + +MACRO {tods} {"ACM Transactions on Database Systems"} + +MACRO {tog} {"ACM Transactions on Graphics"} + +MACRO {toms} {"ACM Transactions on Mathematical Software"} + +MACRO {toois} {"ACM Transactions on Office Information Systems"} + +MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"} + +MACRO {tcs} {"Theoretical Computer Science"} + +READ + +FUNCTION {sortify} +{ purify$ + "l" change.case$ +} + +INTEGERS { len } + +FUNCTION {chop.word} +{ 's := + 'len := + s #1 len substring$ = + { s len #1 + global.max$ substring$ } + 's + if$ +} + +FUNCTION {sort.format.names} +{ 's := + #1 'nameptr := + "" + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { nameptr #1 > + { " " * } + 'skip$ + if$ + s nameptr "{vv{ } }{ll{ }}{ ff{ }}{ jj{ }}" format.name$ 't := + nameptr numnames = t "others" = and + { "et al" * } + { t sortify * } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {sort.format.title} +{ 't := + "A " #2 + "An " #3 + "The " #4 t chop.word + chop.word + chop.word + sortify + #1 global.max$ substring$ +} + +FUNCTION {author.sort} +{ author empty$ + { key empty$ + { "to sort, need author or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {author.editor.sort} +{ author empty$ + { editor empty$ + { key empty$ + { "to sort, need author, editor, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { editor sort.format.names } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {author.organization.sort} +{ author empty$ + { organization empty$ + { key empty$ + { "to sort, need author, organization, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { "The " #4 organization chop.word sortify } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {editor.organization.sort} +{ editor empty$ + { organization empty$ + { key empty$ + { "to sort, need editor, organization, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { "The " #4 organization chop.word sortify } + if$ + } + { editor sort.format.names } + if$ +} + +FUNCTION {presort} +{ type$ "book" = + type$ "inbook" = + or + 'author.editor.sort + { type$ "proceedings" = + 'editor.organization.sort + { type$ "manual" = + 'author.organization.sort + 'author.sort + if$ + } + if$ + } + if$ + " " + * + year field.or.null sortify + * + " " + * + title field.or.null + sort.format.title + * + #1 entry.max$ substring$ + 'sort.key$ := +} + +ITERATE {presort} + +SORT + +STRINGS { longest.label } + +INTEGERS { number.label longest.label.width } + +FUNCTION {initialize.longest.label} +{ "" 'longest.label := + #1 'number.label := + #0 'longest.label.width := +} + +FUNCTION {longest.label.pass} +{ number.label int.to.str$ 'label := + number.label #1 + 'number.label := + label width$ longest.label.width > + { label 'longest.label := + label width$ 'longest.label.width := + } + 'skip$ + if$ +} + +EXECUTE {initialize.longest.label} + +ITERATE {longest.label.pass} + +FUNCTION {begin.bib} +{ preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{" longest.label * "}" * write$ newline$ +} + +EXECUTE {begin.bib} + +EXECUTE {init.state.consts} + +ITERATE {call.type$} + +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} + +EXECUTE {end.bib} + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/ipsjsort.bst Thu May 09 20:51:09 2019 +0900 @@ -0,0 +1,1358 @@ +% ipsjsort.bst 28-Oct-10 by Hiroshi Nakashima (ver 3.00) +% ipsjsort.bst 15-Jun-07 by Hiroshi Nakashima (ver 2.12) +% ipsjsort.bst 30-Jan-02 by Hiroshi Nakashima (ver 2.00) +% ipsjsort.bst 28-Dec-93 by Hiroshi Nakashima (ver 1.00) +% jssst.bst tomura@etl.go.jp (Satoru Tomura) +% BibTeX standard bibliography style `jplain' + % version 0.10 for JBibTeX versions 0.10 or later, JLaTeX version 2.09. + % by Shouichi Matsui, matsui@denken.junet + +ENTRY + { address + author + booktitle + chapter + doi % 3.00(1) + edition + editor + howpublished + institution + journal + key + month + note + number + organization + pages + publisher + refdate % 3.00(1) + school + series + title + type + url % 3.00(1) + volume + year + yomi + } + {} + { label } + +INTEGERS { output.state before.all mid.sentence after.sentence after.block } + +INTEGERS { before.year } + +FUNCTION {init.state.consts} +{ #0 'before.all := + #1 'mid.sentence := + #2 'after.sentence := + #3 'after.block := + #4 'before.year := % 1.00(1) +} + +STRINGS { s t } + +FUNCTION {is.kanji} +{ is.kanji.str$ } % 1.00(2), 2.00(1) + +FUNCTION {is.kanji.title} % 3.00(1) +{ title is.kanji.str$ } + +FUNCTION {output.nonnull} +{ 's := + output.state mid.sentence = + { duplicate$ is.kanji % 2.00(2) + { "," * write$ } + { ", " * write$ } + if$ + } + { output.state after.block = + { add.period$ write$ + newline$ + "\newblock " write$ + } + { output.state before.all = + 'write$ + { output.state before.year = % 1.00(1) + { " " * write$ } + { add.period$ " " * write$ } + if$ + } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} + +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} + +FUNCTION {required.argument} +{ 't := + empty$ + {"Missing required argument " t * " in " * cite$ * warning$} + 'skip$ + if$ +} + +FUNCTION {required.exclusive.or.argument} +{ 't := + empty$ + { 's := + empty$ + { t " or " * s * " is missing in " * cite$ * warning$} + 'skip$ + if$ + } + { 's := + empty$ + 'skip$ + { "You can use only one of " t * " and " * s * " in " * cite$ * warning$} + if$ + } + if$ +} + +FUNCTION {required.and.or.argument} +{ 't := empty$ + { 's := empty$ + { "there's no " t * " and/or " * s * cite$ * warning$ } + 'skip$ + if$ + } + { pop$ pop$ } + if$ +} + +FUNCTION {optional.series.volume.number.argument} +{ series empty$ + { volume empty$ + { number empty$ + 'skip$ + { "there's a number but no series in " cite$ * warning$ } + if$ + } + { number empty$ + { "there's a volume but no series in " cite$ * warning$ } + { "you can use only one of volume and number in " cite$ * warning$} + if$ + } + if$ + } + { volume empty$ + { number empty$ + { "there's a series but neither volume nor number in " cite$ * warning$ } + 'skip$ + if$ + } + { number empty$ + 'skip$ + { "you can use only one of volume and number in " cite$ * warning$ } + if$ + } + if$ + } + if$ +} + +FUNCTION {output.bibitem} +{ newline$ + "\bibitem{" write$ + cite$ write$ + "}" write$ + newline$ + before.all 'output.state := +} + +FUNCTION {fin.entry} +{ add.period$ + write$ + newline$ +} + +FUNCTION {new.block} +{ output.state before.all = + 'skip$ + { after.block 'output.state := } + if$ +} + +FUNCTION {new.sentence} +{ output.state after.block = + 'skip$ + { output.state before.all = + 'skip$ + { after.sentence 'output.state := } + if$ + } + if$ +} + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} + +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} + +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} + +FUNCTION {new.block.checka} +{ empty$ + 'skip$ + 'new.block + if$ +} + +FUNCTION {new.block.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.block + if$ +} + +FUNCTION {new.sentence.checka} +{ empty$ + 'skip$ + 'new.sentence + if$ +} + +FUNCTION {new.sentence.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.sentence + if$ +} + +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} + +FUNCTION {emphasize} +{ duplicate$ empty$ + { pop$ "" } + { duplicate$ is.kanji + 'skip$ % 1.00(3) + { "{\em " swap$ * "}" * } % 2.00(3) + if$ + } + if$ +} + +INTEGERS { nameptr namesleft numnames } + +FUNCTION {format.names} % 1.00(4), 2.00(4) +{ 's := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr "{ff}{ll}" format.name$ duplicate$ is.kanji + { duplicate$ text.length$ #6 > + { 't := } + { pop$ s nameptr "{ff} {ll}" format.name$ 't := } + if$ + } + { pop$ s nameptr "{vv }{ll}{, jj}{, f.}" format.name$ 't := } + if$ + nameptr #1 > + { namesleft #1 > + { s is.kanji + { "," } + { ", " } + if$ + * t * } + { t "others" = + { s is.kanji + {"ほか" * } + {" et al." * } + if$ + } + { s is.kanji + {"," * t * } % put "," here for Kanji (H.N.) + {" and " * t * } + if$ + } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {format.authors} +{ author empty$ + { "" } + { author format.names } + if$ +} + +FUNCTION {add.colon} % 2.00(5) +{ duplicate$ is.kanji + { "\:" * } % 2.12(1) + { ": " * } + if$ +} + +FUNCTION {format.editors.inparen} % 2.00(6) +{ editor empty$ + { "" } + { editor format.names + editor num.names$ #1 > + { editor is.kanji + {",編" * } {", eds." *} if$ + } + { editor is.kanji + {",編" *} {", ed." *} if$ + } + if$ + } + if$ +} + +FUNCTION {format.editors} +{ editor empty$ + { "" } + { editor format.names + editor num.names$ #1 > + { editor is.kanji + {"(編)" * } {"(eds.)" *} if$ % 2.00(7) + } + { editor is.kanji + {"(編)" *} {"(ed.)" *} if$ % 2.00(7) + } + if$ + } + if$ +} + +FUNCTION {n.dashify} +{ 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + } + { { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + +FUNCTION {format.date} +{ before.year 'output.state := % 1.00(1) + year empty$ + { month empty$ + { "" } + { "there's a month but no year in " cite$ * warning$ + "" % 1.00(5) + } + if$ + } + { "(" year ")" * * } % 1.00(5) + if$ +} + +FUNCTION {format.ref.date} % 3.00(1)>> +{ before.year 'output.state := + is.kanji.title + { "\refdatej{" refdate "}" * *} + { "\refdatee{" refdate "}" * *} + if$ +} % 3.00(1)<< + +FUNCTION {tie.or.space.connect} +{ duplicate$ text.length$ #3 < + { "~" } + { "\ " } % 1.00(6) + if$ + swap$ * * +} + +FUNCTION {output.volume} +{ + volume empty$ + 'skip$ + { "Vol.~" volume * output} + if$ + +} + +FUNCTION {output.number} +{ + number empty$ + 'skip$ + { "No.~" number * output} + if$ +} + +FUNCTION {output.series.volume.number} +{ series empty$ + { output.volume + output.number } + { series is.kanji + volume empty$ + number empty$ + or + and + { series " " * volume * number * output} + { series output + output.volume + output.number} + if$ + } + if$ +} + +FUNCTION {format.edition} +{ edition empty$ + { "" } + { output.state mid.sentence = + { edition "l" change.case$ " edition" * } + { edition "t" change.case$ " edition" * } + if$ + } + if$ +} + +INTEGERS { multiresult } + +FUNCTION {multi.page.check} +{ 't := + #0 'multiresult := + { multiresult not + t empty$ not + and + } + { t #1 #1 substring$ + duplicate$ "-" = + swap$ duplicate$ "," = + swap$ "+" = + or or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + multiresult +} + +FUNCTION {format.online} % 3.00(1)>> +{ is.kanji.title + { "(オンライン)" * } + { duplicate$ empty$ + { "(online)" * } + { " (online)" * } + if$ + } + if$ +} % 3.00(1)<< + +FUNCTION {format.url} % 3.00(1)>> +{ is.kanji.title + { "\urlj{" url "}" * * } + { "\urle{" url "}" * * } + if$ +} % 3.00(1)<< + +FUNCTION {format.pages} % 1.00(7) +{ pages empty$ + { "" } + { pages multi.page.check + { "pp." pages n.dashify tie.or.space.connect } + { "p." pages tie.or.space.connect } + if$ + } + if$ +} + +FUNCTION {format.doi.url} % 3.00(1)>> +{ doi empty$ + { url empty$ + 'skip$ + { format.online output.nonnull + format.url + } + if$ + } + { format.online output.nonnull + "\doi{" doi "}" * * + } + if$ % 3.00(1)<< +} + +FUNCTION {format.pages.output} % 3.00(1)>> +{ format.pages + format.doi.url output % 3.00(1)<< +} + +FUNCTION {format.vol.num.pages} % 1.00(8) +{ volume empty$ + { ""} + { " Vol.~" volume * } + if$ + number empty$ + 'skip$ + { volume empty$ + { "there's a number but no volume in " cite$ * warning$ } + { "," *} + if$ + " No.~" number * * + } + if$ + pages empty$ + 'skip$ + { duplicate$ empty$ + { pop$ format.pages } + { ", " * format.pages * } + if$ + } + if$ + format.doi.url % 3.00(1) +} + +FUNCTION {format.chapter.pages} +{ chapter empty$ + 'format.pages + { type empty$ + { "chapter" chapter tie.or.space.connect } + { type is.kanji + { chapter type tie.or.space.connect } + { type "l" change.case$ chapter tie.or.space.connect } + if$ + } + if$ + pages empty$ + 'skip$ + { ", " * format.pages * } + if$ + } + if$ + format.doi.url % 3.00(1) +} + +FUNCTION {format.in.ed.booktitle} +{ booktitle empty$ + { "" } + { booktitle emphasize + editor empty$ + 'skip$ + { booktitle is.kanji + { "(" * format.editors.inparen * ")" *} % 2.00(6,7) + { " (" * format.editors.inparen * ")" *} % 1.00(9), 2.00(6) + if$ + } + if$ + } + if$ +} + +FUNCTION {empty.misc.check} +{ author empty$ title empty$ howpublished empty$ + month empty$ year empty$ note empty$ + and and and and and + key empty$ not and + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ +} + +FUNCTION {format.thesis.type} +{ type empty$ + 'skip$ + { pop$ + type "t" change.case$ + } + if$ +} + +FUNCTION {format.tr.number} +{ type empty$ + { title empty$ + { "Technical Report" } + { title is.kanji + { "技術報告" } + { "Technical Report" } + if$ + } + if$ + } + {type} + if$ + number empty$ + { "t" change.case$ } + { " " number * * } + if$ +} + +FUNCTION {format.article.crossref} % 2.00(8) +{ key empty$ + { journal empty$ + { "need key or journal for " cite$ * " to crossref " * crossref * + warning$ + "" + } + { journal emphasize } % 1.00(10) + if$ + } + { "In " key * } + if$ + " \cite{" * crossref * "}" * +} + +FUNCTION {format.crossref.editor} % 1.00(11) +{ editor #1 + editor is.kanji { "{ff}" } { "{vv }{ll}" } if$ + format.name$ + editor num.names$ duplicate$ + #2 > + { editor is.kanji + {pop$ "ほか" *} {pop$ " et al." * } if$ + } + { #2 < + 'skip$ + { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { editor is.kanji + {"ほか" *} {" et al." * } if$ + } + { editor is.kanji + {"・" * editor #2 "{ff}" format.name$ * } + {" and " * editor #2 "{vv }{ll}" format.name$ * } + if$ + } + if$ + } + if$ + } + if$ +} + +FUNCTION {format.book.crossref} % 2.00(8) +{ editor empty$ + editor field.or.null author field.or.null = + or + { key empty$ + { series empty$ + { "need editor, key, or series for " cite$ * " to crossref " * + crossref * warning$ + "" + } + { series emphasize } % 1.00(10) + if$ + } + { "In " key * } + if$ + } + { format.crossref.editor } + if$ + " \cite{" * crossref * "}" * + volume empty$ + { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ } + { duplicate$ is.kanji { "," } { ", "} if$ * + "Vol." * volume tie.or.space.connect + } + if$ +} + +FUNCTION {format.incoll.inproc.crossref} % 2.00(8) +{ editor empty$ + editor field.or.null author field.or.null = + or + { key empty$ + { booktitle empty$ + { "need editor, key, or booktitle for " cite$ * " to crossref " * + crossref * warning$ + "" + } + { booktitle emphasize } % 1.00(10) + if$ + } + { "In " key * } + if$ + } + { format.crossref.editor } + if$ + " \cite{" * crossref * "}" * +} + +FUNCTION {article} +{ +%%%% + author "author" required.argument + title "title" required.argument + journal "journal" required.argument + year "year" required.argument +%%%% jssst + volume "volume" + number "number" + required.and.or.argument + pages "pages" required.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output + crossref missing$ + { journal emphasize output + format.vol.num.pages output % 1.00(12) + format.date output + } + { format.article.crossref output.nonnull + format.pages.output % 3.00(1) + } + if$ + new.block + note output + fin.entry +} + +FUNCTION {book} +{ +%%%% + author "author" + editor "editor" + required.exclusive.or.argument + title "title" required.argument + publisher "publisher" required.argument + year "year" required.argument + optional.series.volume.number.argument +%%%% + output.bibitem + author empty$ + { format.editors} + { format.authors} + if$ + add.colon % 2.00(5) + title emphasize output + crossref missing$ + { output.series.volume.number + publisher output + address output + } + { new.block + format.book.crossref output.nonnull + } + if$ + format.edition output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {booklet} +{ +%%%% + title "title" required.argument +%%%% jssst + author "author" required.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output + howpublished output + address output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {inbook} +{ +%%%% + author "author" + editor "editor" + required.exclusive.or.argument + title "title" required.argument + chapter "chapter" + pages "pages" + required.and.or.argument + publisher "publisher" required.argument + year "year" required.argument + + optional.series.volume.number.argument +%%%% + output.bibitem + author empty$ + { format.editors} + { format.authors} + if$ + add.colon % 2.00(5) + title emphasize output + crossref missing$ + { output.series.volume.number + format.chapter.pages output + publisher output + } + { format.chapter.pages output + new.block + format.book.crossref output.nonnull + } + if$ + format.edition output + format.date output % 1.00(13) + new.block + note output + fin.entry +} + +FUNCTION {incollection} +{ +%%%% + author "author" required.argument + title "title" required.argument + booktitle "booktitle" required.argument + publisher "publisher" required.argument + year "year" required.argument + + optional.series.volume.number.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output + crossref missing$ + { format.in.ed.booktitle output + output.series.volume.number + publisher output + address output + format.edition output + format.chapter.pages output % 1.00(13) + format.date output + } + { format.incoll.inproc.crossref output.nonnull + format.chapter.pages output + } + if$ + new.block + note output + fin.entry +} + +FUNCTION {inproceedings} +{ +%%%% + author "author" required.argument + title "title" required.argument + year "year" required.argument + + optional.series.volume.number.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output + crossref missing$ + { format.in.ed.booktitle output + booktitle "booktitle" required.argument + output.series.volume.number + address output + organization output + publisher output + format.pages.output % 3.00(1) + format.date output % 1.00(13) + } + { format.incoll.inproc.crossref output.nonnull + format.pages.output % 3.00(1) + } + if$ + new.block + note output + fin.entry +} + +FUNCTION {conference} { inproceedings } + +FUNCTION {manual} +{ +%%%% + title "title" required.argument +%%%% jssst + author "author" + organization "organazaion" + required.exclusive.or.argument +%%%% + output.bibitem + author empty$ + { organization} + { format.authors} + if$ + add.colon % 2.00(5) + title emphasize output + author empty$ + 'skip$ + { organization output } + if$ + address output + format.edition output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {mastersthesis} +{ +%%%% + author "author" required.argument + title "title" required.argument + school "school" required.argument + year "year" required.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output + author empty$ + { "Master's thesis" } + { author is.kanji + { "修士論文" } + { "Master's thesis" } + if$ + } + if$ + format.thesis.type output.nonnull + school output + address output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {misc} +{ +%%%% +%%%% jssst + author "author" required.argument + title "title" required.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output + howpublished output + format.date output + new.block + note output + fin.entry + empty.misc.check +} + +FUNCTION {phdthesis} +{ +%%%% + author "author" required.argument + title "title" required.argument + school "school" required.argument + year "year" required.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output % 2.00(9) + author empty$ + { "PhD Thesis" } + { author is.kanji + { "博士論文" } + { "PhD Thesis" } + if$ + } + if$ + format.thesis.type output.nonnull + school output + address output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {proceedings} +{ +%%%% + title "title" required.argument + year "year" required.argument + + optional.series.volume.number.argument +%%%% jssst + editor "editor" + organization "organization" + required.exclusive.or.argument +%%%% + output.bibitem + editor empty$ + { organization } + { format.editors } + if$ + add.colon % 2.00(5) + title emphasize output + output.series.volume.number + address output + editor empty$ + 'skip$ + { organization output } + if$ + publisher output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {techreport} +{ +%%%% + author "author" required.argument + title "title" required.argument + institution "institution" required.argument + year "year" required.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output + format.tr.number output.nonnull + institution output + address output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {unpublished} +{ +%%%% + author "author" required.argument + title "title" required.argument + note "note" required.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {webpage} % 3.00(1)>> +{ +%%%% + author "author" required.argument + title "title" required.argument + url "url" required.argument + refdate "refdate" required.argument +%%%% + output.bibitem + format.authors add.colon + title output + organization format.doi.url output + format.ref.date output + new.block + note output + fin.entry +} % 3.00(1)<< + +FUNCTION {default.type} { misc } + +MACRO {jan} {"January"} + +MACRO {feb} {"February"} + +MACRO {mar} {"March"} + +MACRO {apr} {"April"} + +MACRO {may} {"May"} + +MACRO {jun} {"June"} + +MACRO {jul} {"July"} + +MACRO {aug} {"August"} + +MACRO {sep} {"September"} + +MACRO {oct} {"October"} + +MACRO {nov} {"November"} + +MACRO {dec} {"December"} + +MACRO {acmcs} {"ACM Computing Surveys"} + +MACRO {acta} {"Acta Informatica"} + +MACRO {cacm} {"Communications of the ACM"} + +MACRO {ibmjrd} {"IBM Journal of Research and Development"} + +MACRO {ibmsj} {"IBM Systems Journal"} + +MACRO {ieeese} {"IEEE Transactions on Software Engineering"} + +MACRO {ieeetc} {"IEEE Transactions on Computers"} + +MACRO {ieeetcad} + {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"} + +MACRO {ipl} {"Information Processing Letters"} + +MACRO {jacm} {"Journal of the ACM"} + +MACRO {jcss} {"Journal of Computer and System Sciences"} + +MACRO {scp} {"Science of Computer Programming"} + +MACRO {sicomp} {"SIAM Journal on Computing"} + +MACRO {tocs} {"ACM Transactions on Computer Systems"} + +MACRO {tods} {"ACM Transactions on Database Systems"} + +MACRO {tog} {"ACM Transactions on Graphics"} + +MACRO {toms} {"ACM Transactions on Mathematical Software"} + +MACRO {toois} {"ACM Transactions on Office Information Systems"} + +MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"} + +MACRO {tcs} {"Theoretical Computer Science"} + +READ + +FUNCTION {sortify} +{ purify$ + "l" change.case$ +} + +INTEGERS { len } + +FUNCTION {chop.word} +{ 's := + 'len := + s #1 len substring$ = + { s len #1 + global.max$ substring$ } + 's + if$ +} + +FUNCTION {sort.format.names} +{ 's := + yomi empty$ + 'skip$ + { yomi 's := } + if$ + + #1 'nameptr := + "" + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { nameptr #1 > + { " " * } + 'skip$ + if$ + s nameptr "{vv{ } }{ll{ }}{ ff{ }}{ jj{ }}" format.name$ 't := + nameptr numnames = t "others" = and + { "et al" * } + { t sortify * } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {sort.format.title} +{ 't := + "A " #2 + "An " #3 + "The " #4 t chop.word + chop.word + chop.word + sortify + #1 global.max$ substring$ +} + +FUNCTION {author.sort} +{ author empty$ + { key empty$ + { "to sort, need author or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {author.editor.sort} +{ author empty$ + { editor empty$ + { key empty$ + { "to sort, need author, editor, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { editor sort.format.names } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {author.organization.sort} +{ author empty$ + { organization empty$ + { key empty$ + { "to sort, need author, organization, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { "The " #4 organization chop.word sortify } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {editor.organization.sort} +{ editor empty$ + { organization empty$ + { key empty$ + { "to sort, need editor, organization, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { "The " #4 organization chop.word sortify } + if$ + } + { editor sort.format.names } + if$ +} + +FUNCTION {presort} +{ type$ "book" = + type$ "inbook" = + or + 'author.editor.sort + { type$ "proceedings" = + 'editor.organization.sort + { type$ "manual" = + 'author.organization.sort + 'author.sort + if$ + } + if$ + } + if$ + " " + * + year field.or.null sortify + * + " " + * + title field.or.null + sort.format.title + * + #1 entry.max$ substring$ + 'sort.key$ := +} + +ITERATE {presort} + +SORT + +STRINGS { longest.label } + +INTEGERS { number.label longest.label.width } + +FUNCTION {initialize.longest.label} +{ "" 'longest.label := + #1 'number.label := + #0 'longest.label.width := +} + +FUNCTION {longest.label.pass} +{ number.label int.to.str$ 'label := + number.label #1 + 'number.label := + label width$ longest.label.width > + { label 'longest.label := + label width$ 'longest.label.width := + } + 'skip$ + if$ +} + +EXECUTE {initialize.longest.label} + +ITERATE {longest.label.pass} + +FUNCTION {begin.bib} +{ preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{" longest.label * "}" * write$ newline$ +} + +EXECUTE {begin.bib} + +EXECUTE {init.state.consts} + +ITERATE {call.type$} + +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} + +EXECUTE {end.bib} + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/ipsjunsrt-e.bst Thu May 09 20:51:09 2019 +0900 @@ -0,0 +1,1103 @@ +% ipsjsort-e.bst 28-Oct-10 by Hiroshi Nakashima (ver 3.00) +% ipsjsort-e.bst 15-Jun-07 by Hiroshi Nakashima (ver 2.12) +% ipsjsort.bst 30-Jan-02 by Hiroshi Nakashima (ver 2.00) +% ipsjsort.bst 28-Dec-93 by Hiroshi Nakashima (ver 1.00) +% jssst.bst tomura@etl.go.jp (Satoru Tomura) +% BibTeX standard bibliography style `jplain' + % version 0.10 for JBibTeX versions 0.10 or later, JLaTeX version 2.09. + % by Shouichi Matsui, matsui@denken.junet + +ENTRY + { address + author + booktitle + chapter + doi % 3.00(1) + edition + editor + howpublished + institution + journal + key + month + note + number + organization + pages + publisher + refdate % 3.00(1) + school + series + title + type + url % 3.00(1) + volume + year + } + {} + { label } + +INTEGERS { output.state before.all mid.sentence after.sentence after.block } + +INTEGERS { before.year } + +FUNCTION {init.state.consts} +{ #0 'before.all := + #1 'mid.sentence := + #2 'after.sentence := + #3 'after.block := + #4 'before.year := % 1.00(1) +} + +STRINGS { s t } + +FUNCTION {output.nonnull} +{ 's := + output.state mid.sentence = + { ", " * write$ } + { output.state after.block = + { add.period$ write$ + newline$ + "\newblock " write$ + } + { output.state before.all = + 'write$ + { output.state before.year = % 1.00(1) + { " " * write$ } + { add.period$ " " * write$ } + if$ + } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} + +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} + +FUNCTION {required.argument} +{ 't := + empty$ + {"Missing required argument " t * " in " * cite$ * warning$} + 'skip$ + if$ +} + +FUNCTION {required.exclusive.or.argument} +{ 't := + empty$ + { 's := + empty$ + { t " or " * s * " is missing in " * cite$ * warning$} + 'skip$ + if$ + } + { 's := + empty$ + 'skip$ + { "You can use only one of " t * " and " * s * " in " * cite$ * warning$} + if$ + } + if$ +} + +FUNCTION {required.and.or.argument} +{ 't := empty$ + { 's := empty$ + { "there's no " t * " and/or " * s * cite$ * warning$ } + 'skip$ + if$ + } + { pop$ pop$ } + if$ +} + +FUNCTION {optional.series.volume.number.argument} +{ series empty$ + { volume empty$ + { number empty$ + 'skip$ + { "there's a number but no series in " cite$ * warning$ } + if$ + } + { number empty$ + { "there's a volume but no series in " cite$ * warning$ } + { "you can use only one of volume and number in " cite$ * warning$} + if$ + } + if$ + } + { volume empty$ + { number empty$ + { "there's a series but neither volume nor number in " cite$ * warning$ } + 'skip$ + if$ + } + { number empty$ + 'skip$ + { "you can use only one of volume and number in " cite$ * warning$ } + if$ + } + if$ + } + if$ +} + +FUNCTION {output.bibitem} +{ newline$ + "\bibitem{" write$ + cite$ write$ + "}" write$ + newline$ + before.all 'output.state := +} + +FUNCTION {fin.entry} +{ add.period$ + write$ + newline$ +} + +FUNCTION {new.block} +{ output.state before.all = + 'skip$ + { after.block 'output.state := } + if$ +} + +FUNCTION {new.sentence} +{ output.state after.block = + 'skip$ + { output.state before.all = + 'skip$ + { after.sentence 'output.state := } + if$ + } + if$ +} + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} + +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} + +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} + +FUNCTION {new.block.checka} +{ empty$ + 'skip$ + 'new.block + if$ +} + +FUNCTION {new.block.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.block + if$ +} + +FUNCTION {new.sentence.checka} +{ empty$ + 'skip$ + 'new.sentence + if$ +} + +FUNCTION {new.sentence.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.sentence + if$ +} + +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} + +FUNCTION {emphasize} +{ duplicate$ empty$ + { pop$ "" } + { "{\em " swap$ * "}" * } + if$ +} + +INTEGERS { nameptr namesleft numnames } + +FUNCTION {format.names} % 1.00(4), 2.00(4) +{ 's := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr "{vv }{ll}{, jj}{, f.}" format.name$ 't := + nameptr #1 > + { namesleft #1 > + { ", " * t * } + { t "others" = + {" et al." * } + {" and " * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {format.authors} +{ author empty$ + { "" } + { author format.names } + if$ +} + +FUNCTION {add.colon} % 2.00(5) +{ ": " * +} + +FUNCTION {format.editors.inparen} % 2.00(6) +{ editor empty$ + { "" } + { editor format.names + editor num.names$ #1 > + {", eds." *} + {", ed." *} + if$ + } + if$ +} + +FUNCTION {format.editors} +{ editor empty$ + { "" } + { editor format.names + editor num.names$ #1 > + {"(eds.)" *} + {"(ed.)" *} + if$ + } + if$ +} + +FUNCTION {n.dashify} +{ 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + } + { { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + +FUNCTION {format.date} +{ before.year 'output.state := % 1.00(1) + year empty$ + { month empty$ + { "" } + { "there's a month but no year in " cite$ * warning$ + "" % 1.00(5) + } + if$ + } + { "(" year ")" * * } % 1.00(5) + if$ +} + +FUNCTION {format.ref.date} % 3.00(1)>> +{ before.year 'output.state := + "\refdatee{" refdate "}" * * +} % 3.00(1)<< + +FUNCTION {tie.or.space.connect} +{ duplicate$ text.length$ #3 < + { "~" } + { "\ " } % 1.00(6) + if$ + swap$ * * +} + +FUNCTION {output.volume} +{ + volume empty$ + 'skip$ + { "Vol.~" volume * output} + if$ + +} + +FUNCTION {output.number} +{ + number empty$ + 'skip$ + { "No.~" number * output} + if$ +} + +FUNCTION {output.series.volume.number} +{ series empty$ + { output.volume + output.number } + { series output + output.volume + output.number } + if$ +} + +FUNCTION {format.edition} +{ edition empty$ + { "" } + { output.state mid.sentence = + { edition "l" change.case$ " edition" * } + { edition "t" change.case$ " edition" * } + if$ + } + if$ +} + +INTEGERS { multiresult } + +FUNCTION {multi.page.check} +{ 't := + #0 'multiresult := + { multiresult not + t empty$ not + and + } + { t #1 #1 substring$ + duplicate$ "-" = + swap$ duplicate$ "," = + swap$ "+" = + or or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + multiresult +} + +FUNCTION {format.online} % 3.00(1)>> +{ duplicate$ empty$ + { "(online)" * } + { " (online)" * } + if$ +} % 3.00(1)<< + +FUNCTION {format.url} % 3.00(1)>> +{ "\urle{" url "}" * * +} % 3.00(1)<< + +FUNCTION {format.pages} % 1.00(7) +{ pages empty$ + { "" } + { pages multi.page.check + { "pp." pages n.dashify tie.or.space.connect } + { "p." pages tie.or.space.connect } + if$ + } + if$ +} + +FUNCTION {format.doi.url} % 3.00(1)>> +{ doi empty$ + { url empty$ + 'skip$ + { format.online output.nonnull + format.url + } + if$ + } + { format.online output.nonnull + "\doi{" doi "}" * * + } + if$ % 3.00(1)<< +} + +FUNCTION {format.pages.output} % 3.00(1)>> +{ format.pages + format.doi.url output % 3.00(1)<< +} + +FUNCTION {format.vol.num.pages} % 1.00(8) +{ volume empty$ + { ""} + { " Vol.~" volume * } + if$ + number empty$ + 'skip$ + { volume empty$ + { "there's a number but no volume in " cite$ * warning$ } + { "," *} + if$ + " No.~" number * * + } + if$ + pages empty$ + 'skip$ + { duplicate$ empty$ + { pop$ format.pages } + { ", " * format.pages * } + if$ + } + if$ + format.doi.url % 3.00(1) +} + +FUNCTION {format.chapter.pages} +{ chapter empty$ + 'format.pages + { type empty$ + { "chapter" chapter tie.or.space.connect } + { type "l" change.case$ chapter tie.or.space.connect } + if$ + pages empty$ + 'skip$ + { ", " * format.pages * } + if$ + } + if$ + format.doi.url % 3.00(1) +} + +FUNCTION {format.in.ed.booktitle} +{ booktitle empty$ + { "" } + { booktitle emphasize + editor empty$ + 'skip$ + { " (" * format.editors.inparen * ")" *} % 1.00(9), 2.00(6) + if$ + } + if$ +} + +FUNCTION {empty.misc.check} +{ author empty$ title empty$ howpublished empty$ + month empty$ year empty$ note empty$ + and and and and and + key empty$ not and + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ +} + +FUNCTION {format.thesis.type} +{ type empty$ + 'skip$ + { pop$ + type "t" change.case$ + } + if$ +} + +FUNCTION {format.tr.number} +{ type empty$ + { "Technical Report" } + {type} + if$ + number empty$ + { "t" change.case$ } + { " " number * * } + if$ +} + +FUNCTION {format.article.crossref} % 2.00(8) +{ key empty$ + { journal empty$ + { "need key or journal for " cite$ * " to crossref " * crossref * + warning$ + "" + } + { journal emphasize } % 1.00(10) + if$ + } + { "In " key * } + if$ + " \cite{" * crossref * "}" * +} + +FUNCTION {format.crossref.editor} % 1.00(11) +{ editor #1 "{vv }{ll}" format.name$ + editor num.names$ duplicate$ + #2 > + {pop$ " et al." * } + { #2 < + 'skip$ + { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = + {" et al." * } + {" and " * editor #2 "{vv }{ll}" format.name$ * } + if$ + } + if$ + } + if$ +} + +FUNCTION {format.book.crossref} % 2.00(8) +{ editor empty$ + editor field.or.null author field.or.null = + or + { key empty$ + { series empty$ + { "need editor, key, or series for " cite$ * " to crossref " * + crossref * warning$ + "" + } + { series emphasize } % 1.00(10) + if$ + } + { "In " key * } + if$ + } + { format.crossref.editor } + if$ + " \cite{" * crossref * "}" * + volume empty$ + { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ } + { * "Vol." * volume tie.or.space.connect } + if$ +} + +FUNCTION {format.incoll.inproc.crossref} % 2.00(8) +{ editor empty$ + editor field.or.null author field.or.null = + or + { key empty$ + { booktitle empty$ + { "need editor, key, or booktitle for " cite$ * " to crossref " * + crossref * warning$ + "" + } + { booktitle emphasize } % 1.00(10) + if$ + } + { "In " key * } + if$ + } + { format.crossref.editor } + if$ + " \cite{" * crossref * "}" * +} + +FUNCTION {article} +{ +%%%% + author "author" required.argument + title "title" required.argument + journal "journal" required.argument + year "year" required.argument +%%%% jssst + volume "volume" + number "number" + required.and.or.argument + pages "pages" required.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output + crossref missing$ + { journal emphasize output + format.vol.num.pages output % 1.00(12) + format.date output + } + { format.article.crossref output.nonnull + format.pages.output % 3.00(1) + } + if$ + new.block + note output + fin.entry +} + +FUNCTION {book} +{ +%%%% + author "author" + editor "editor" + required.exclusive.or.argument + title "title" required.argument + publisher "publisher" required.argument + year "year" required.argument + optional.series.volume.number.argument +%%%% + output.bibitem + author empty$ + { format.editors} + { format.authors} + if$ + add.colon % 2.00(5) + title emphasize output + crossref missing$ + { output.series.volume.number + publisher output + address output + } + { new.block + format.book.crossref output.nonnull + } + if$ + format.edition output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {booklet} +{ +%%%% + title "title" required.argument +%%%% jssst + author "author" required.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output + howpublished output + address output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {inbook} +{ +%%%% + author "author" + editor "editor" + required.exclusive.or.argument + title "title" required.argument + chapter "chapter" + pages "pages" + required.and.or.argument + publisher "publisher" required.argument + year "year" required.argument + + optional.series.volume.number.argument +%%%% + output.bibitem + author empty$ + { format.editors} + { format.authors} + if$ + add.colon % 2.00(5) + title emphasize output + crossref missing$ + { output.series.volume.number + format.chapter.pages output + publisher output + } + { format.chapter.pages output + new.block + format.book.crossref output.nonnull + } + if$ + format.edition output + format.date output % 1.00(13) + new.block + note output + fin.entry +} + +FUNCTION {incollection} +{ +%%%% + author "author" required.argument + title "title" required.argument + booktitle "booktitle" required.argument + publisher "publisher" required.argument + year "year" required.argument + + optional.series.volume.number.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output + crossref missing$ + { format.in.ed.booktitle output + output.series.volume.number + publisher output + address output + format.edition output + format.chapter.pages output % 1.00(13) + format.date output + } + { format.incoll.inproc.crossref output.nonnull + format.chapter.pages output + } + if$ + new.block + note output + fin.entry +} + +FUNCTION {inproceedings} +{ +%%%% + author "author" required.argument + title "title" required.argument + year "year" required.argument + + optional.series.volume.number.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output + crossref missing$ + { format.in.ed.booktitle output + booktitle "booktitle" required.argument + output.series.volume.number + address output + organization output + publisher output + format.pages.output % 3.00(1) + format.date output % 1.00(13) + } + { format.incoll.inproc.crossref output.nonnull + format.pages.output % 3.00(1) + } + if$ + new.block + note output + fin.entry +} + +FUNCTION {conference} { inproceedings } + +FUNCTION {manual} +{ +%%%% + title "title" required.argument +%%%% jssst + author "author" + organization "organazaion" + required.exclusive.or.argument +%%%% + output.bibitem + author empty$ + { organization} + { format.authors} + if$ + add.colon % 2.00(5) + title emphasize output + author empty$ + 'skip$ + { organization output } + if$ + address output + format.edition output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {mastersthesis} +{ +%%%% + author "author" required.argument + title "title" required.argument + school "school" required.argument + year "year" required.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output + "Master's thesis" + format.thesis.type output.nonnull + school output + address output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {misc} +{ +%%%% +%%%% jssst + author "author" required.argument + title "title" required.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output + howpublished output + format.date output + new.block + note output + fin.entry + empty.misc.check +} + +FUNCTION {phdthesis} +{ +%%%% + author "author" required.argument + title "title" required.argument + school "school" required.argument + year "year" required.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output % 2.00(9) + "PhD Thesis" + format.thesis.type output.nonnull + school output + address output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {proceedings} +{ +%%%% + title "title" required.argument + year "year" required.argument + + optional.series.volume.number.argument +%%%% jssst + editor "editor" + organization "organization" + required.exclusive.or.argument +%%%% + output.bibitem + editor empty$ + { organization } + { format.editors } + if$ + add.colon % 2.00(5) + title emphasize output + output.series.volume.number + address output + editor empty$ + 'skip$ + { organization output } + if$ + publisher output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {techreport} +{ +%%%% + author "author" required.argument + title "title" required.argument + institution "institution" required.argument + year "year" required.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output + format.tr.number output.nonnull + institution output + address output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {unpublished} +{ +%%%% + author "author" required.argument + title "title" required.argument + note "note" required.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {webpage} % 3.00(1)>> +{ +%%%% + author "author" required.argument + title "title" required.argument + url "url" required.argument + refdate "refdate" required.argument +%%%% + output.bibitem + format.authors add.colon + title output + organization format.doi.url output + format.ref.date output + new.block + note output + fin.entry +} % 3.00(1)<< + +FUNCTION {default.type} { misc } + +MACRO {jan} {"January"} + +MACRO {feb} {"February"} + +MACRO {mar} {"March"} + +MACRO {apr} {"April"} + +MACRO {may} {"May"} + +MACRO {jun} {"June"} + +MACRO {jul} {"July"} + +MACRO {aug} {"August"} + +MACRO {sep} {"September"} + +MACRO {oct} {"October"} + +MACRO {nov} {"November"} + +MACRO {dec} {"December"} + +MACRO {acmcs} {"ACM Computing Surveys"} + +MACRO {acta} {"Acta Informatica"} + +MACRO {cacm} {"Communications of the ACM"} + +MACRO {ibmjrd} {"IBM Journal of Research and Development"} + +MACRO {ibmsj} {"IBM Systems Journal"} + +MACRO {ieeese} {"IEEE Transactions on Software Engineering"} + +MACRO {ieeetc} {"IEEE Transactions on Computers"} + +MACRO {ieeetcad} + {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"} + +MACRO {ipl} {"Information Processing Letters"} + +MACRO {jacm} {"Journal of the ACM"} + +MACRO {jcss} {"Journal of Computer and System Sciences"} + +MACRO {scp} {"Science of Computer Programming"} + +MACRO {sicomp} {"SIAM Journal on Computing"} + +MACRO {tocs} {"ACM Transactions on Computer Systems"} + +MACRO {tods} {"ACM Transactions on Database Systems"} + +MACRO {tog} {"ACM Transactions on Graphics"} + +MACRO {toms} {"ACM Transactions on Mathematical Software"} + +MACRO {toois} {"ACM Transactions on Office Information Systems"} + +MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"} + +MACRO {tcs} {"Theoretical Computer Science"} + +READ + +STRINGS { longest.label } + +INTEGERS { number.label longest.label.width } + +FUNCTION {initialize.longest.label} +{ "" 'longest.label := + #1 'number.label := + #0 'longest.label.width := +} + +FUNCTION {longest.label.pass} +{ number.label int.to.str$ 'label := + number.label #1 + 'number.label := + label width$ longest.label.width > + { label 'longest.label := + label width$ 'longest.label.width := + } + 'skip$ + if$ +} + +EXECUTE {initialize.longest.label} + +ITERATE {longest.label.pass} + +FUNCTION {begin.bib} +{ preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{" longest.label * "}" * write$ newline$ +} + +EXECUTE {begin.bib} + +EXECUTE {init.state.consts} + +ITERATE {call.type$} + +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} + +EXECUTE {end.bib} + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/ipsjunsrt.bst Thu May 09 20:51:09 2019 +0900 @@ -0,0 +1,1208 @@ +% ipsjunsrt.bst 28-Oct-10 by Hiroshi Nakashima (ver 3.00) +% ipsjunsrt.bst 15-Jun-07 by Hiroshi Nakashima (ver 2.12) +% ipsjunsrt.bst 30-Jan-02 by Hiroshi Nakashima (ver 2.00) +% ipsjunsrt.bst 28-Dec-93 by Hiroshi Nakashima (ver 1.00) +% jssst.bst tomura@etl.go.jp (Satoru Tomura) +% BibTeX standard bibliography style `jplain' + % version 0.10 for JBibTeX versions 0.10 or later, JLaTeX version 2.09. + % by Shouichi Matsui, matsui@denken.junet + +ENTRY + { address + author + booktitle + chapter + doi % 3.00(1) + edition + editor + howpublished + institution + journal + key + month + note + number + organization + pages + publisher + refdate % 3.00(1) + school + series + title + type + url % 3.00(1) + volume + year + yomi + } + {} + { label } + +INTEGERS { output.state before.all mid.sentence after.sentence after.block } + +INTEGERS { before.year } + +FUNCTION {init.state.consts} +{ #0 'before.all := + #1 'mid.sentence := + #2 'after.sentence := + #3 'after.block := + #4 'before.year := % 1.00(1) +} + +STRINGS { s t } + +FUNCTION {is.kanji} +{ is.kanji.str$ } % 1.00(2), 2.00(1) + +FUNCTION {is.kanji.title} % 3.00(1) +{ title is.kanji.str$ } + +FUNCTION {output.nonnull} +{ 's := + output.state mid.sentence = + { duplicate$ is.kanji % 2.00(2) + { "," * write$ } + { ", " * write$ } + if$ + } + { output.state after.block = + { add.period$ write$ + newline$ + "\newblock " write$ + } + { output.state before.all = + 'write$ + { output.state before.year = % 1.00(1) + { " " * write$ } + { add.period$ " " * write$ } + if$ + } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} + +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} + +FUNCTION {required.argument} +{ 't := + empty$ + {"Missing required argument " t * " in " * cite$ * warning$} + 'skip$ + if$ +} + +FUNCTION {required.exclusive.or.argument} +{ 't := + empty$ + { 's := + empty$ + { t " or " * s * " is missing in " * cite$ * warning$} + 'skip$ + if$ + } + { 's := + empty$ + 'skip$ + { "You can use only one of " t * " and " * s * " in " * cite$ * warning$} + if$ + } + if$ +} + +FUNCTION {required.and.or.argument} +{ 't := empty$ + { 's := empty$ + { "there's no " t * " and/or " * s * cite$ * warning$ } + 'skip$ + if$ + } + { pop$ pop$ } + if$ +} + +FUNCTION {optional.series.volume.number.argument} +{ series empty$ + { volume empty$ + { number empty$ + 'skip$ + { "there's a number but no series in " cite$ * warning$ } + if$ + } + { number empty$ + { "there's a volume but no series in " cite$ * warning$ } + { "you can use only one of volume and number in " cite$ * warning$} + if$ + } + if$ + } + { volume empty$ + { number empty$ + { "there's a series but neither volume nor number in " cite$ * warning$ } + 'skip$ + if$ + } + { number empty$ + 'skip$ + { "you can use only one of volume and number in " cite$ * warning$ } + if$ + } + if$ + } + if$ +} + +FUNCTION {output.bibitem} +{ newline$ + "\bibitem{" write$ + cite$ write$ + "}" write$ + newline$ + before.all 'output.state := +} + +FUNCTION {fin.entry} +{ add.period$ + write$ + newline$ +} + +FUNCTION {new.block} +{ output.state before.all = + 'skip$ + { after.block 'output.state := } + if$ +} + +FUNCTION {new.sentence} +{ output.state after.block = + 'skip$ + { output.state before.all = + 'skip$ + { after.sentence 'output.state := } + if$ + } + if$ +} + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} + +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} + +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} + +FUNCTION {new.block.checka} +{ empty$ + 'skip$ + 'new.block + if$ +} + +FUNCTION {new.block.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.block + if$ +} + +FUNCTION {new.sentence.checka} +{ empty$ + 'skip$ + 'new.sentence + if$ +} + +FUNCTION {new.sentence.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.sentence + if$ +} + +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} + +FUNCTION {emphasize} +{ duplicate$ empty$ + { pop$ "" } + { duplicate$ is.kanji + 'skip$ % 1.00(3) + { "{\em " swap$ * "}" * } % 2.00(3) + if$ + } + if$ +} + +INTEGERS { nameptr namesleft numnames } + +FUNCTION {format.names} % 1.00(4), 2.00(4) +{ 's := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr "{ff}{ll}" format.name$ duplicate$ is.kanji + { duplicate$ text.length$ #6 > + { 't := } + { pop$ s nameptr "{ff} {ll}" format.name$ 't := } + if$ + } + { pop$ s nameptr "{vv }{ll}{, jj}{, f.}" format.name$ 't := } + if$ + nameptr #1 > + { namesleft #1 > + { s is.kanji + { "," } + { ", " } + if$ + * t * } + { t "others" = + { s is.kanji + {"ほか" * } + {" et al." * } + if$ + } + { s is.kanji + {"," * t * } % put "," here for Kanji (H.N.) + {" and " * t * } + if$ + } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {format.authors} +{ author empty$ + { "" } + { author format.names } + if$ +} + +FUNCTION {add.colon} % 2.00(5) +{ duplicate$ is.kanji + { "\:" * } % 2.12(1) + { ": " * } + if$ +} + +FUNCTION {format.editors.inparen} % 2.00(6) +{ editor empty$ + { "" } + { editor format.names + editor num.names$ #1 > + { editor is.kanji + {",編" * } {", eds." *} if$ + } + { editor is.kanji + {",編" *} {", ed." *} if$ + } + if$ + } + if$ +} + +FUNCTION {format.editors} +{ editor empty$ + { "" } + { editor format.names + editor num.names$ #1 > + { editor is.kanji + {"(編)" * } {"(eds.)" *} if$ % 2.00(7) + } + { editor is.kanji + {"(編)" *} {"(ed.)" *} if$ % 2.00(7) + } + if$ + } + if$ +} + +FUNCTION {n.dashify} +{ 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + } + { { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + +FUNCTION {format.date} +{ before.year 'output.state := % 1.00(1) + year empty$ + { month empty$ + { "" } + { "there's a month but no year in " cite$ * warning$ + "" % 1.00(5) + } + if$ + } + { "(" year ")" * * } % 1.00(5) + if$ +} + +FUNCTION {format.ref.date} % 3.00(1)>> +{ before.year 'output.state := + is.kanji.title + { "\refdatej{" refdate "}" * *} + { "\refdatee{" refdate "}" * *} + if$ +} % 3.00(1)<< + +FUNCTION {tie.or.space.connect} +{ duplicate$ text.length$ #3 < + { "~" } + { "\ " } % 1.00(6) + if$ + swap$ * * +} + +FUNCTION {output.volume} +{ + volume empty$ + 'skip$ + { "Vol.~" volume * output} + if$ + +} + +FUNCTION {output.number} +{ + number empty$ + 'skip$ + { "No.~" number * output} + if$ +} + +FUNCTION {output.series.volume.number} +{ series empty$ + { output.volume + output.number } + { series is.kanji + volume empty$ + number empty$ + or + and + { series " " * volume * number * output} + { series output + output.volume + output.number} + if$ + } + if$ +} + +FUNCTION {format.edition} +{ edition empty$ + { "" } + { output.state mid.sentence = + { edition "l" change.case$ " edition" * } + { edition "t" change.case$ " edition" * } + if$ + } + if$ +} + +INTEGERS { multiresult } + +FUNCTION {multi.page.check} +{ 't := + #0 'multiresult := + { multiresult not + t empty$ not + and + } + { t #1 #1 substring$ + duplicate$ "-" = + swap$ duplicate$ "," = + swap$ "+" = + or or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + multiresult +} + +FUNCTION {format.online} % 3.00(1)>> +{ is.kanji.title + { "(オンライン)" * } + { duplicate$ empty$ + { "(online)" * } + { " (online)" * } + if$ + } + if$ +} % 3.00(1)<< + +FUNCTION {format.url} % 3.00(1)>> +{ is.kanji.title + { "\urlj{" url "}" * * } + { "\urle{" url "}" * * } + if$ +} % 3.00(1)<< + +FUNCTION {format.pages} % 1.00(7) +{ pages empty$ + { "" } + { pages multi.page.check + { "pp." pages n.dashify tie.or.space.connect } + { "p." pages tie.or.space.connect } + if$ + } + if$ +} + +FUNCTION {format.doi.url} % 3.00(1)>> +{ doi empty$ + { url empty$ + 'skip$ + { format.online output.nonnull + format.url + } + if$ + } + { format.online output.nonnull + "\doi{" doi "}" * * + } + if$ % 3.00(1)<< +} + +FUNCTION {format.pages.output} % 3.00(1)>> +{ format.pages + format.doi.url output % 3.00(1)<< +} + +FUNCTION {format.vol.num.pages} % 1.00(8) +{ volume empty$ + { ""} + { " Vol.~" volume * } + if$ + number empty$ + 'skip$ + { volume empty$ + { "there's a number but no volume in " cite$ * warning$ } + { "," *} + if$ + " No.~" number * * + } + if$ + pages empty$ + 'skip$ + { duplicate$ empty$ + { pop$ format.pages } + { ", " * format.pages * } + if$ + } + if$ + format.doi.url % 3.00(1) +} + +FUNCTION {format.chapter.pages} +{ chapter empty$ + 'format.pages + { type empty$ + { "chapter" chapter tie.or.space.connect } + { type is.kanji + { chapter type tie.or.space.connect } + { type "l" change.case$ chapter tie.or.space.connect } + if$ + } + if$ + pages empty$ + 'skip$ + { ", " * format.pages * } + if$ + } + if$ + format.doi.url % 3.00(1) +} + +FUNCTION {format.in.ed.booktitle} +{ booktitle empty$ + { "" } + { booktitle emphasize + editor empty$ + 'skip$ + { booktitle is.kanji + { "(" * format.editors.inparen * ")" *} % 2.00(6,7) + { " (" * format.editors.inparen * ")" *} % 1.00(9), 2.00(6) + if$ + } + if$ + } + if$ +} + +FUNCTION {empty.misc.check} +{ author empty$ title empty$ howpublished empty$ + month empty$ year empty$ note empty$ + and and and and and + key empty$ not and + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ +} + +FUNCTION {format.thesis.type} +{ type empty$ + 'skip$ + { pop$ + type "t" change.case$ + } + if$ +} + +FUNCTION {format.tr.number} +{ type empty$ + { title empty$ + { "Technical Report" } + { title is.kanji + { "技術報告" } + { "Technical Report" } + if$ + } + if$ + } + {type} + if$ + number empty$ + { "t" change.case$ } + { " " number * * } + if$ +} + +FUNCTION {format.article.crossref} % 2.00(8) +{ key empty$ + { journal empty$ + { "need key or journal for " cite$ * " to crossref " * crossref * + warning$ + "" + } + { journal emphasize } % 1.00(10) + if$ + } + { "In " key * } + if$ + " \cite{" * crossref * "}" * +} + +FUNCTION {format.crossref.editor} % 1.00(11) +{ editor #1 + editor is.kanji { "{ff}" } { "{vv }{ll}" } if$ + format.name$ + editor num.names$ duplicate$ + #2 > + { editor is.kanji + {pop$ "ほか" *} {pop$ " et al." * } if$ + } + { #2 < + 'skip$ + { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { editor is.kanji + {"ほか" *} {" et al." * } if$ + } + { editor is.kanji + {"・" * editor #2 "{ff}" format.name$ * } + {" and " * editor #2 "{vv }{ll}" format.name$ * } + if$ + } + if$ + } + if$ + } + if$ +} + +FUNCTION {format.book.crossref} % 2.00(8) +{ editor empty$ + editor field.or.null author field.or.null = + or + { key empty$ + { series empty$ + { "need editor, key, or series for " cite$ * " to crossref " * + crossref * warning$ + "" + } + { series emphasize } % 1.00(10) + if$ + } + { "In " key * } + if$ + } + { format.crossref.editor } + if$ + " \cite{" * crossref * "}" * + volume empty$ + { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ } + { duplicate$ is.kanji { "," } { ", "} if$ * + "Vol." * volume tie.or.space.connect + } + if$ +} + +FUNCTION {format.incoll.inproc.crossref} % 2.00(8) +{ editor empty$ + editor field.or.null author field.or.null = + or + { key empty$ + { booktitle empty$ + { "need editor, key, or booktitle for " cite$ * " to crossref " * + crossref * warning$ + "" + } + { booktitle emphasize } % 1.00(10) + if$ + } + { "In " key * } + if$ + } + { format.crossref.editor } + if$ + " \cite{" * crossref * "}" * +} + +FUNCTION {article} +{ +%%%% + author "author" required.argument + title "title" required.argument + journal "journal" required.argument + year "year" required.argument +%%%% jssst + volume "volume" + number "number" + required.and.or.argument + pages "pages" required.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output + crossref missing$ + { journal emphasize output + format.vol.num.pages output % 1.00(12) + format.date output + } + { format.article.crossref output.nonnull + format.pages.output % 3.00(1) + } + if$ + new.block + note output + fin.entry +} + +FUNCTION {book} +{ +%%%% + author "author" + editor "editor" + required.exclusive.or.argument + title "title" required.argument + publisher "publisher" required.argument + year "year" required.argument + optional.series.volume.number.argument +%%%% + output.bibitem + author empty$ + { format.editors} + { format.authors} + if$ + add.colon % 2.00(5) + title emphasize output + crossref missing$ + { output.series.volume.number + publisher output + address output + } + { new.block + format.book.crossref output.nonnull + } + if$ + format.edition output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {booklet} +{ +%%%% + title "title" required.argument +%%%% jssst + author "author" required.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output + howpublished output + address output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {inbook} +{ +%%%% + author "author" + editor "editor" + required.exclusive.or.argument + title "title" required.argument + chapter "chapter" + pages "pages" + required.and.or.argument + publisher "publisher" required.argument + year "year" required.argument + + optional.series.volume.number.argument +%%%% + output.bibitem + author empty$ + { format.editors} + { format.authors} + if$ + add.colon % 2.00(5) + title emphasize output + crossref missing$ + { output.series.volume.number + format.chapter.pages output + publisher output + } + { format.chapter.pages output + new.block + format.book.crossref output.nonnull + } + if$ + format.edition output + format.date output % 1.00(13) + new.block + note output + fin.entry +} + +FUNCTION {incollection} +{ +%%%% + author "author" required.argument + title "title" required.argument + booktitle "booktitle" required.argument + publisher "publisher" required.argument + year "year" required.argument + + optional.series.volume.number.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output + crossref missing$ + { format.in.ed.booktitle output + output.series.volume.number + publisher output + address output + format.edition output + format.chapter.pages output % 1.00(13) + format.date output + } + { format.incoll.inproc.crossref output.nonnull + format.chapter.pages output + } + if$ + new.block + note output + fin.entry +} + +FUNCTION {inproceedings} +{ +%%%% + author "author" required.argument + title "title" required.argument + year "year" required.argument + + optional.series.volume.number.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output + crossref missing$ + { format.in.ed.booktitle output + booktitle "booktitle" required.argument + output.series.volume.number + address output + organization output + publisher output + format.pages.output % 3.00(1) + format.date output % 1.00(13) + } + { format.incoll.inproc.crossref output.nonnull + format.pages.output % 3.00(1) + } + if$ + new.block + note output + fin.entry +} + +FUNCTION {conference} { inproceedings } + +FUNCTION {manual} +{ +%%%% + title "title" required.argument +%%%% jssst + author "author" + organization "organazaion" + required.exclusive.or.argument +%%%% + output.bibitem + author empty$ + { organization} + { format.authors} + if$ + add.colon % 2.00(5) + title emphasize output + author empty$ + 'skip$ + { organization output } + if$ + address output + format.edition output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {mastersthesis} +{ +%%%% + author "author" required.argument + title "title" required.argument + school "school" required.argument + year "year" required.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output + author empty$ + { "Master's thesis" } + { author is.kanji + { "修士論文" } + { "Master's thesis" } + if$ + } + if$ + format.thesis.type output.nonnull + school output + address output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {misc} +{ +%%%% +%%%% jssst + author "author" required.argument + title "title" required.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output + howpublished output + format.date output + new.block + note output + fin.entry + empty.misc.check +} + +FUNCTION {phdthesis} +{ +%%%% + author "author" required.argument + title "title" required.argument + school "school" required.argument + year "year" required.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output % 2.00(9) + author empty$ + { "PhD Thesis" } + { author is.kanji + { "博士論文" } + { "PhD Thesis" } + if$ + } + if$ + format.thesis.type output.nonnull + school output + address output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {proceedings} +{ +%%%% + title "title" required.argument + year "year" required.argument + + optional.series.volume.number.argument +%%%% jssst + editor "editor" + organization "organization" + required.exclusive.or.argument +%%%% + output.bibitem + editor empty$ + { organization } + { format.editors } + if$ + add.colon % 2.00(5) + title emphasize output + output.series.volume.number + address output + editor empty$ + 'skip$ + { organization output } + if$ + publisher output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {techreport} +{ +%%%% + author "author" required.argument + title "title" required.argument + institution "institution" required.argument + year "year" required.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output + format.tr.number output.nonnull + institution output + address output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {unpublished} +{ +%%%% + author "author" required.argument + title "title" required.argument + note "note" required.argument +%%%% + output.bibitem + format.authors add.colon % 2.00(5) + title output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {webpage} % 3.00(1)>> +{ +%%%% + author "author" required.argument + title "title" required.argument + url "url" required.argument + refdate "refdate" required.argument +%%%% + output.bibitem + format.authors add.colon + title output + organization format.doi.url output + format.ref.date output + new.block + note output + fin.entry +} % 3.00(1)<< + +FUNCTION {default.type} { misc } + +MACRO {jan} {"January"} + +MACRO {feb} {"February"} + +MACRO {mar} {"March"} + +MACRO {apr} {"April"} + +MACRO {may} {"May"} + +MACRO {jun} {"June"} + +MACRO {jul} {"July"} + +MACRO {aug} {"August"} + +MACRO {sep} {"September"} + +MACRO {oct} {"October"} + +MACRO {nov} {"November"} + +MACRO {dec} {"December"} + +MACRO {acmcs} {"ACM Computing Surveys"} + +MACRO {acta} {"Acta Informatica"} + +MACRO {cacm} {"Communications of the ACM"} + +MACRO {ibmjrd} {"IBM Journal of Research and Development"} + +MACRO {ibmsj} {"IBM Systems Journal"} + +MACRO {ieeese} {"IEEE Transactions on Software Engineering"} + +MACRO {ieeetc} {"IEEE Transactions on Computers"} + +MACRO {ieeetcad} + {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"} + +MACRO {ipl} {"Information Processing Letters"} + +MACRO {jacm} {"Journal of the ACM"} + +MACRO {jcss} {"Journal of Computer and System Sciences"} + +MACRO {scp} {"Science of Computer Programming"} + +MACRO {sicomp} {"SIAM Journal on Computing"} + +MACRO {tocs} {"ACM Transactions on Computer Systems"} + +MACRO {tods} {"ACM Transactions on Database Systems"} + +MACRO {tog} {"ACM Transactions on Graphics"} + +MACRO {toms} {"ACM Transactions on Mathematical Software"} + +MACRO {toois} {"ACM Transactions on Office Information Systems"} + +MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"} + +MACRO {tcs} {"Theoretical Computer Science"} + +READ + +STRINGS { longest.label } + +INTEGERS { number.label longest.label.width } + +FUNCTION {initialize.longest.label} +{ "" 'longest.label := + #1 'number.label := + #0 'longest.label.width := +} + +FUNCTION {longest.label.pass} +{ number.label int.to.str$ 'label := + number.label #1 + 'number.label := + label width$ longest.label.width > + { label 'longest.label := + label width$ 'longest.label.width := + } + 'skip$ + if$ +} + +EXECUTE {initialize.longest.label} + +ITERATE {longest.label.pass} + +FUNCTION {begin.bib} +{ preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{" longest.label * "}" * write$ newline$ +} + +EXECUTE {begin.bib} + +EXECUTE {init.state.consts} + +ITERATE {call.type$} + +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} + +EXECUTE {end.bib} + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/sigos.bib Thu May 09 20:51:09 2019 +0900 @@ -0,0 +1,8 @@ +@article{ + gears, + author = "河野 真治 and 伊波 立樹 and 東恩納 琢偉", + title = "Code Gear、Data Gear に基づく OS のプロトタイプ", + journal = "情報処理学会システムソフトウェアとオペレーティング・システム研究会(OS)", + month = "May", + year = 2016 +}
--- a/paper/sigos.tex Thu May 09 17:49:21 2019 +0900 +++ b/paper/sigos.tex Thu May 09 20:51:09 2019 +0900 @@ -8,31 +8,31 @@ \usepackage{graphicx} \usepackage{latexsym} \usepackage{url} -\usepackage{listings} +\usepackage{listings, jlisting} \usepackage{enumitem} - +\usepackage{caption} -\lstset{% - language={Java},%使用言語 - basicstyle={\small},%書体 - commentstyle={\small\itshape},%コメントの書体 - keywordstyle={\small\bfseries},%キーワードの書体 - %identifierstyle={\small},% - %ndkeywordstyle={\small},% - stringstyle={\small},%文字列の書体 - frame={trlb},%外枠 - breaklines=true,%改行 - columns=[l]{fullflexible},% - xrightmargin=0zw,% - xleftmargin=3zw,% - numbers=left,%行番号の表示 - numberstyle={\scriptsize},%行番号の書体 - numbersep=1zw,% - stepnumber=1,% - lineskip=-0.5ex,% - captionpos=b%キャプションの位置 +\lstset{ + language=C, + tabsize=2, + frame=single, + basicstyle={\ttfamily\footnotesize},% + identifierstyle={\footnotesize},% + commentstyle={\footnotesize\itshape},% + keywordstyle={\footnotesize\bfseries},% + ndkeywordstyle={\footnotesize},% + stringstyle={\footnotesize\ttfamily}, + breaklines=true, + captionpos=t, + columns=[l]{fullflexible},% + xrightmargin=0zw,% + xleftmargin=1zw,% + aboveskip=1zw, + numberstyle={\scriptsize},% + stepnumber=1, + numbersep=0.5zw,% + lineskip=-0.5ex, } - \renewcommand{\lstlistingname}{Code} @@ -51,6 +51,7 @@ %\再再受付{2015}{11}{20} %省略可能 \採録{2019}{5}{9} +\makeatletter @@ -64,23 +65,24 @@ \paffiliate{IPSJ}{琉球大学工学部情報工学科\\ Information Engineering, University of the Ryukyus.} - + -\author{一木貴裕}{Takahiro Itsuki}{IPSJ} -\author{赤堀貴一}{Ki-ichi Akahori}{IPSJ} -\author{河野真治}{Shinji KONO}{IPSJ} +\author{一木 貴裕}{Takahiro Itsuki}{IPSJ} +%\author{赤堀貴一}{Ki-ichi Akahori}{IPSJ} +\author{河野 真治}{Shinji KONO}{IPSJ} \begin{abstract} -当研究室で開発した分散フレームワークChristieを用いて、 -Etherium を参考にBlock chainを実装した。 -Paxos のリーダ選出アルゴリズムと、Christieの持つTopology Managerとの相性が問題になる。 -Gears OSのファイルシステムなどに使えるかどうかの調査を行う。 +当研究室で開発した分散フレームワークChristieを用いて, +Etherium を参考にBlock chainを実装した. +Paxos のリーダ選出アルゴリズムと,Christieの持つTopology Managerとの相性が問題になる. +Gears OSのファイルシステムなどに使えるかどうかの調査を行う. \end{abstract} +\maketitle \begin{jkeyword} -分散計算、ブロックチェーン +分散計算,ブロックチェーン \end{jkeyword} \begin{eabstract} @@ -99,34 +101,35 @@ %1 \section{Block Chain と Gears OS} -コンピュータのデータに不整合は起こり得る. 不整合は誤操作や, 複数人によるデータの同時書き込みによって起こる. -特に分散環境下で問題になる。 -ブロックチェーンはデータを分散でき, 不整合の検知が可能な仕組みを提供していう。 -当研究室で開発中のGearsOSの分散ファイルシステムの技術として、ブロックチェーンが使用できるかどうかを調査中である。 +コンピュータのデータに不整合は起こり得る.不整合は誤操作や,複数人によるデータの同時書き込みによって起こる. +特に分散環境下で問題になる. +ブロックチェーンはデータを分散でき, 不整合の検知が可能な仕組みを提供していう. +当研究室で開発中のGearsOSの分散ファイルシステムの技術として,ブロックチェーンが使用できるかどうかを調査中である. そのために当研究室ではJava上で開発された分散フレームワーク -Christieにブロックチェーンを実装することにした。 +Christieにブロックチェーンを実装することにした. \section{Chrsitie} %\subsection{Christieとは} -Christieは当研究室で開発している分散フレームワークである. -Christieは当研究室で開発しているGearsOSに組み込まれる予定がある. %GearsOSとは -そのためGearsOSを構成する言語Continuation based Cと似た概念がある. -Christieに存在する概念として次のようなものがある. +Christieは当研究室で開発している分散フレームワークである. +Christieは当研究室で開発しているGearsOSに組み込まれる予定がある. +GearsOSとは同様に当研究室で開発しており,言語Continuation based CによってOSそのものとアプリケーションを記述する.%GearsOSとは +そのためGearsOSを構成する言語CbCと似た概念がある. +Christieに存在する概念として次のようなものがある. \begin{itemize} \item CodeGear(以下 CG) \item DataGear(以下 DG) \item CodeGearManager(以下 CGM) \item DataGearManager(以下 DGM) \end{itemize} -CGはクラス,スレッドに相当し, Javaの継承を用いて記述する. -DGは変数データに相当し, CG内でアノテーションを用いて変数データを取り出せる. -CGMはノードであり, DGM,CG,DGMを管理する. +CGはクラス,スレッドに相当し,Javaの継承を用いて記述する. +DGは変数データに相当し,CG内でアノテーションを用いて変数データを取り出せる. +CGMはノードであり,DGM,CG,DGMを管理する. -DS Manager(以下DSM)にはLocal DSMとRemote DSMが存在する。Local DSMは各ノード固有のデータベースである。 +DS Manager(以下DSM)にはLocal DSMとRemote DSMが存在する.Local DSMは各ノード固有のデータベースである. -Remote DSMは他ノードのLocal DSMに対応するproxyであり、接続しているノードの数だけ存在する(図 \ref{fig:Remote DSM} )。 -他ノードのLocal DSMに書き込みたい場合はRemote DSMに対して書き込めば良い。 +Remote DSMは他ノードのLocal DSMに対応するproxyであり,接続しているノードの数だけ存在する(図 \ref{fig:RemoteDSM} ). +他ノードのLocal DSMに書き込みたい場合はRemote DSMに対して書き込めば良い. \newpage @@ -135,111 +138,107 @@ \includegraphics[width=8cm]{images/remote_datasegment.pdf} \end{center} \caption{Remote DSMは他のノードのLocal DSMのproxy } - \label{fig:Remote DSM} +\label{fig:RemoteDSM} \end{figure} -Remote DSMを立ち上げるには、DataSegmentクラスが提供するconnectメソッドを用いる。 -接続したいノードのipアドレスとport番号、そして任意のManager名を指定することで立ちあげられる。 -その後はManager名を指定してData Segment APIを用いてDSのやり取りを行うため、プログラマはManager名さえ -意識すればLocalへの操作もRemoteへの操作も同じ様に扱える。 - +Remote DSMを立ち上げるには,DataSegmentクラスが提供するconnectメソッドを用いる. +接続したいノードのipアドレスとport番号,そして任意のManager名を指定することで立ちあげられる. +その後はManager名を指定してData Segment APIを用いてDSのやり取りを行うため,プログラマはManager名さえ +意識すればLocalへの操作もRemoteへの操作も同じ様に扱える. -DGMはDGを管理するものであり, putという操作により変数データ, すなわちDGを格納できる. -DGMのput操作を行う際にはLocalとRemoteと2つのどちらかを選び, 変数のkeyとデータを引数に書く. -Localであれば, LocalのCGMが管理しているDGMに対し, DGを格納していく. -Remoteであれば接続したRemote先のCGMのDGMにDGを格納できる. -put操作を行った後は, 対象のDGMの中にqueとして補完される. -DGを取り出す際には, CG内で宣言した変数データにアノテーションをつける. -DGのアノテーションにはTake, Peek,TakeFrom, PeekFromの4つがある. + +DGMはDGを管理するものであり,putという操作により変数データ,すなわちDGを格納できる. +DGMのput操作を行う際にはLocalとRemoteと2つのどちらかを選び,変数のkeyとデータを引数に書く. +Localであれば,LocalのCGMが管理しているDGMに対し,DGを格納していく. +Remoteであれば接続したRemote先のCGMのDGMにDGを格納できる. +put操作を行った後は,対象のDGMの中にqueとして補完される. +DGを取り出す際には,CG内で宣言した変数データにアノテーションをつける. +DGのアノテーションにはTake,Peek,TakeFrom,PeekFromの4つがある. \begin{description} -\item[Take] 先頭のDGを読み込み, そのDGを削除する. DGが複数ある場合, この動作を用いる. -\item[Peek] 先頭のDGを読み込むが, DGが削除されない. そのため, 特に操作をしない場合は同じデータを参照し続ける. -\item[TakeFrom(Remote DGM name)] Takeと似ているが, Remote DGM nameを指定することで, その接続先(Remote)のDGMからTake操作を行える. -\item[PeekFrom(Remote DGM name)] Peekと似ているが, Remote DGM nameを指定することで, その接続先(Remote)のDGMからPeek操作を行える. +\item[Take] 先頭のDGを読み込み,そのDGを削除する.DGが複数ある場合,この動作を用いる. +\item[Peek] 先頭のDGを読み込むが,DGが削除されない.そのため,特に操作をしない場合は同じデータを参照し続ける. +\item[TakeFrom(Remote DGM name)] Takeと似ているが,Remote DGM nameを指定することで,その接続先(Remote)のDGMからTake操作を行える. +\item[PeekFrom(Remote DGM name)] Peekと似ているが,Remote DGM nameを指定することで,その接続先(Remote)のDGMからPeek操作を行える. \end{description} - + %\subsection{プログラミングの例} -ここでは, Christieで実際にプログラムを記述する例を述べる. -CGMを作り, setup(new CodeGear)を動かすことにより, DGを持ち合わせ,DGが揃った場合にCodeGearが実装される. -CGMを作る方法はStartCodeGear(以下SCG)を継承したものからcreate-CGM(port)methodを実行することによりCGMが作られる. -SCGのコードの例をソースコード4.1に示す. %refを使う +ここでは,Christieで実際にプログラムを記述する例を述べる. +CGMを作り,setup(new CodeGear)を動かすことにより,DGを持ち合わせ,DGが揃った場合にCodeGearが実装される. +CGMを作る方法はStartCodeGear(以下SCG)を継承したものからcreate-CGM(port)methodを実行することによりCGMが作られる. +SCGのコードの例をソースコード\ref{code:StartHelloWorld}に示す.%refを使う -\begin{flushleft} -\lstinputlisting[label=code:StartHelloWorld,caption=StartHelloWorld]{src/HelloWorld/StartHelloWorld.java} -\end{flushleft} +\lstinputlisting[label=code:StartHelloWorld ,caption={\footnotesize StartHelloWorld}]{src/HelloWorld/StartHelloWorld.java} \section{Annotation} -ChristieではInput DG の指定にはアノテーションを使う. -アノテーションとは, クラスやメソッド、パッケージに対して付加情報を記述できるJavaのMeta Computationである. -先頭に@をつけることで記述でき, オリジナルのアノテーションを定義することもできる. -Inputとなる型の変数を直接宣言し, 変数名としてkeyを記述する. -そして, その宣言の上にアノテーションでTakeまたはPeekを指定する(ソースコード\ref{src:takeex}). +ChristieではInput DG の指定にはアノテーションを使う. +アノテーションとは,クラスやメソッド,パッケージに対して付加情報を記述できるJavaのMeta Computationである. +先頭に@をつけることで記述でき,オリジナルのアノテーションを定義することもできる. +Inputとなる型の変数を直接宣言し,変数名としてkeyを記述する. +そして,その宣言の上にアノテーションでTakeまたはPeekを指定する(ソースコード\ref{src:takeex}). -\lstinputlisting[label=src:takeex, caption=Takeの例]{src/christie/InputDG.java} +\lstinputlisting[label=src:takeex, caption=T]{src/christie/InputDG.java} -アノテーションで指定したInputDGは, CGを生成した際にCodeGear.class内で待ち合わせの処理が行われる. -これにはJavaのreflectionAPIを利用しており, アノテーションと同時に変数名も取得できるため, 変数名によるkey指定が実現した. +アノテーションで指定したInputDGは,CGを生成した際にCodeGear.class内で待ち合わせの処理が行われる. +これにはJavaのreflectionAPIを利用しており, アノテーションと同時に変数名も取得できるため,変数名によるkey指定が実現した. -Christieのこのインプットアノテーションはフィールドに対してしか記述できないため, keyの指定とTake/Peekの指定を必ず一箇所で書くことが明確に決まっている. -これにより, 外のCSからのkeyへの干渉をされることがなり, key の指定が複数の CG に分散することがない. -また、keyを変数名にしたことで、動的なkeyの指定や、keyと変数名の不一致による可読性の低下を防ぐことができた。 +Christieのこのインプットアノテーションはフィールドに対してしか記述できないため,keyの指定とTake/Peekの指定を必ず一箇所で書くことが明確に決まっている. +これにより,外のCSからのkeyへの干渉をされることがなり,key の指定が複数の CG に分散することがない. +また,keyを変数名にしたことで,動的なkeyの指定や,keyと変数名の不一致による可読性の低下を防ぐことができた. -リモートノードに対してTake/Peekする際は、TakeFrom/PeekFromのアノテーションを用いる(ソースコード\ref{src:remotetake})。 +リモートノードに対してTake/Peekする際は,TakeFrom/PeekFromのアノテーションを用いる(ソースコード\ref{src:remotetake}). \lstinputlisting[label=src:remotetake, caption=TakeFromの例]{src/christie/RemoteInputDG.java} -Christie は通信の際にDGを圧縮することができる. +Christie は通信の際にDGを圧縮することができる. 圧縮のMeta Computationを -指定する際にDGM名の前にcompressedをつけることができる. (ソースコード\ref{src:compresslocal})。 +指定する際にDGM名の前にcompressedをつけることができる.(ソースコード\ref{src:compresslocal}). \lstinputlisting[label=src:compresslocal, caption=Remoteから圧縮して受け取る例]{src/christie/CompressLocal.java} -ChristieではInput DGは直接変数を宣言されているので, -他の場所を辿らなくともCGを見るだけでインプットされるデータの型が分かるようになっている. -ソースコード\ref{src:getdata}はInputDGのデータを扱うである。 +ChristieではInput DGは直接変数を宣言されているので, +他の場所を辿らなくともCGを見るだけでインプットされるデータの型が分かるようになっている. +ソースコード\ref{src:getdata}はInputDGのデータを扱うである. \lstinputlisting[label=src:getdata, caption=InputDGを扱う例]{src/christie/GetData.java} -InputDGとして宣言した変数の型は、reflectionAPIにより内部で保存され、リモートノードと通信する際も適切な変換が行われる。 -このようにプログラマが指定しなくとも正しい型で取得できるため、プログラマの負担を減らし信頼性を保証することができる。 +InputDGとして宣言した変数の型は,reflectionAPIにより内部で保存され,リモートノードと通信する際も適切な変換が行われる. +このようにプログラマが指定しなくとも正しい型で取得できるため,プログラマの負担を減らし信頼性を保証することができる. \section{TopologyManager} -TopologyManagerとは,Topologyを形成するために,参加を表明したノード,TopologyNodeに名前を与え,必要があればノード同士の配線も行うコードである. -TopologyManagerのTopology形成方法として,静的Topologyと動的Topologyがある. -静的Topologyはコード\ref{code:dot-example}のようなdotファイルを与えることで,ノードの関係を図\ref{fig:dot-example}のようにする. -静的Topologyはdotがいるのノード数と同等のTopologyNodeがあって初めて,CodeGearが実行される. +TopologyManagerとは,Topologyを形成するために,参加を表明したノード,TopologyNodeに名前を与え,必要があればノード同士の配線も行うコードである. +TopologyManagerのTopology形成方法として,静的Topologyと動的Topologyがある. +静的Topologyはコード\ref{code:dot-example}のようなdotファイルを与えることで,ノードの関係を図\ref{fig:dot-example}のようにする. +静的Topologyはdotがいるのノード数と同等のTopologyNodeがあって初めて,CodeGearが実行される. \lstinputlisting[caption=ring.dot, label=code:dot-example]{src/ring.dot} -\begin{figure}[h] -\begin{center} +\begin{figure}[ht] \includegraphics[width=120pt]{images/ring.pdf} \caption{ring.dotを図式化したもの} -\end{center} \label{fig:dot-example} \end{figure} - 動的Topologyは参加を表明したノードに対し,動的にノード同士の関係を作る.例えばTreeを構成する場合,参加したノードから順に,rootに近い位置の役割を与える.また,CodeGearはノードが参加しmparentに接続された後に実行される. + 動的Topologyは参加を表明したノードに対し,動的にノード同士の関係を作る.例えばTreeを構成する場合,参加したノードから順に,rootに近い位置の役割を与える.また,CodeGearはノードが参加しmparentに接続された後に実行される. %2 \section{ブロックチェーンのトランザクション} %2.1 %\subsection{P2P (Peer-to-Peer)} -ブロックチェーンはP2Pにてネットワーク間が動作している,つまり.ブロックチェーンネットワークにはサーバー,クライアントの区別がなく,全てのノードが平等である.そのため,非中央時にデータの管理をおこなう. +ブロックチェーンはP2Pにてネットワーク間が動作している,つまり.ブロックチェーンネットワークにはサーバー,クライアントの区別がなく,全てのノードが平等である.そのため,非中央時にデータの管理をおこなう. -ブロックチェーンにおけるブロックは,複数のトランザクションをまとめたものである. -ブロックの構造は使用するコンセンサスアルゴリズムによって変わるが,基本的な構造としては次のとおりである. +ブロックチェーンにおけるブロックは,複数のトランザクションをまとめたものである. +ブロックの構造は使用するコンセンサスアルゴリズムによって変わるが,基本的な構造としては次のとおりである. \begin{itemize} \item BlockHeader \begin{itemize} @@ -250,24 +249,25 @@ \item TransactionList \end{itemize} -BlockHeaderには,前のブロックをハッシュ化したもの,トランザクションをまとめたmerkle treeのrootのhash,そのブロックを生成したtimeとなっている. -previous block hashは,前のブロックのパラメータを選べてhash化したものである. -それが連なっていることで図2.1のようなhash chainとして,ブロックがつながっている. %図はrefで +BlockHeaderには,前のブロックをハッシュ化したもの,トランザクションをまとめたmerkle treeのrootのhash,そのブロックを生成したtimeとなっている. +previous block hashは,前のブロックのパラメータを選べてhash化したものである. +それが連なっていることで図\ref{hash chain}のようなhash chainとして,ブロックがつながっている.%図はrefで -\begin{figure}[h] +\begin{figure}[ht] \begin{center} \includegraphics[width=240pt]{images/chain.pdf} -\caption{hash chain} +\caption{ブロックチェーンの図} +\label{hash chain} \end{center} \end{figure} -そのため,一つのブロックが変更されれば,その後につながるブロック全てを更新しなければいけなくなる. -ブロックが生成された場合,知っているノードにそのブロックをブロードキャストする. -実際には通信量を抑えるためにブロック高を送った後、ブロックをシリアライズして送信する場合もある. % ブロック高はタイポ? +そのため,一つのブロックが変更されれば,その後につながるブロック全てを更新しなければいけなくなる. +ブロックが生成された場合,知っているノードにそのブロックをブロードキャストする. +実際には通信量を抑えるためにブロックを送った後,ブロックをシリアライズして送信する場合もある.% ブロック高はタイポ? -ノードごとにブロックを検証し,誤りがあればそのブロックを破棄し,誤りがなければ更にそのノードがブロックをブロードキャストする. -そして,Transaction PoolというTransactionを貯めておく場所から,そのブロックに含まれているTransactionを削除し,新しいブロックを生成する. +ノードごとにブロックを検証し,誤りがあればそのブロックを破棄し,誤りがなければ更にそのノードがブロックをブロードキャストする. +そして,Transaction PoolというTransactionを貯めておく場所から,そのブロックに含まれているTransactionを削除し,新しいブロックを生成する. %\begin{quote} %\small @@ -275,131 +275,131 @@ %\end{quote} %\subsection{トランザクションとその構造} -トランザクションとはデータのやり取りを行った記録の最小単位である. -トランザクションの構造は次のとおりである. +トランザクションとはデータのやり取りを行った記録の最小単位である. +トランザクションの構造は次のとおりである. \begin{description} -\item[TransactionHash] トランザクションをハッシュ化したもの. -\item[data] データ. -\item[sendAddress] 送り元のアカウントのアドレス. -\item[recieveAddress] 送り先のアカウントのアドレス. -\item[signature] トランザクションの一部と秘密鍵をSHA256でハッシュ化したもの. ECDSAで署名している. +\item[TransactionHash] トランザクションをハッシュ化したもの. +\item[data] データ. +\item[sendAddress] 送り元のアカウントのアドレス. +\item[recieveAddress] 送り先のアカウントのアドレス. +\item[signature] トランザクションの一部と秘密鍵をSHA256でハッシュ化したもの. ECDSAで署名している. \end{description} -トランザクションはノード間で伝搬され,ノードごとに検証される. -そして検証を終え,不正なトランザクションであればそのトランザクションを破棄し,検証に通った場合はTransaction Poolに取り組まれ,また検証したノードからトランザクションがブロードキャストされる. +トランザクションはノード間で伝搬され,ノードごとに検証される. +そして検証を終え,不正なトランザクションであればそのトランザクションを破棄し,検証に通った場合はTransaction Poolに取り組まれ,また検証したノードからトランザクションがブロードキャストされる. \section{Proof of Workを用いたコンセンサス} %\subsection{fork} -ブロックの生成をした後にブロードキャストをすると,ブロック高の同じ,もしくは相手のブロック高の高いブロックチェーンにたどり着く場合がある. -当然,相手のブロックチェーンはこれを破棄する. -しかしこの場合,異なるブロックを持った2つのブロックチェーンをこの状態をforkと呼ぶ. -fork状態になると,2つの異なるブロックチェーンができることになるため,一つにまとめなければならない. -1つにまとめるためにコンセンサスアルゴリズムを用いる. % が,コンセンサスアルゴリズムについては次章で説明する. +ブロックの生成をした後にブロードキャストをすると,ブロック高の同じ,もしくは相手のブロック高の高いブロックチェーンにたどり着く場合がある. +当然,相手のブロックチェーンはこれを破棄する. +しかしこの場合,異なるブロックを持った2つのブロックチェーンをこの状態をforkと呼ぶ. +fork状態になると,2つの異なるブロックチェーンができることになるため,一つにまとめなければならない. +1つにまとめるためにコンセンサスアルゴリズムを用いるが,コンセンサスアルゴリズムについては次章で説明する. %\section{Proof of Workを用いたコンセンサス} -ブロックチェーンでは,パブリックブロックチェーンの場合とコンソーシアムブロックチェーンによってコンセンサスアルゴリズムが変わる. -この章ではパブリックブロックチェーンのBitcoin,Ethereumに使われているProof of Workとコンソーシアムブロックチェーンに使えるPaxosを説明する。 +ブロックチェーンでは,パブリックブロックチェーンの場合とコンソーシアムブロックチェーンによってコンセンサスアルゴリズムが変わる. +この章ではパブリックブロックチェーンのBitcoin,Ethereumに使われているProof of Workとコンソーシアムブロックチェーンに使えるPaxosを説明する. %\subsection{Proof of Workを用いたコンセンサス} -パブリックブロックチェーンとは,不特定多数のノードが参加するブロックチェーンシステムのことをさす。 -よって,不特定多数のノード間,全体のノードの参加数が変わる状況でコンセンサスが取れるアルゴリズムを使用しなければならない. -Proof of Workは不特定多数のノードを対象としてコンセンサスが取れる. -ノードの計算量によってコンセンサスを取るからである. -次のような問題が生じてもProof of Workはコンセンサスを取ることができる. +パブリックブロックチェーンとは,不特定多数のノードが参加するブロックチェーンシステムのことをさす. +よって,不特定多数のノード間,全体のノードの参加数が変わる状況でコンセンサスが取れるアルゴリズムを使用しなければならない. +Proof of Workは不特定多数のノードを対象としてコンセンサスが取れる. +ノードの計算量によってコンセンサスを取るからである. +次のような問題が生じてもProof of Workはコンセンサスを取ることができる. \begin{enumerate} -\item プロセス毎に処理の速度が違う. つまり, メッセージの返信が遅い可能性がある -\item 通信にどれだけの時間がかかるかわからず, その途中でメッセージが失われる可能性がある, -\item プロセスは停止する可能性がある. また, 復旧する可能性もある. -\item 悪意ある情報を他のノードが送信する可能性がある. +\item プロセス毎に処理の速度が違う.つまり, メッセージの返信が遅い可能性がある +\item 通信にどれだけの時間がかかるかわからず, その途中でメッセージが失われる可能性がある, +\item プロセスは停止する可能性がある.また, 復旧する可能性もある. +\item 悪意ある情報を他のノードが送信する可能性がある. \end{enumerate} -Proof of Workに必要なパラメータは次のとおりである. +Proof of Workに必要なパラメータは次のとおりである. \begin{itemize} \item nonce \item difficulty \end{itemize} -nonceはブロックのパラメータに含まれる. -difficultyはProof of Workの難しさ,正確にいえば1つのブロックを生成する時間を調整している.Proof of Workはこれらのパラメータを使って次のようにブロックを作る. +nonceはブロックのパラメータに含まれる. +difficultyはProof of Workの難しさ,正確にいえば1つのブロックを生成する時間を調整している.Proof of Workはこれらのパラメータを使って次のようにブロックを作る. \begin{enumerate} -\item ブロックとnonceを加えたものをハッシュ化する. この際, nonceによって, ブロックのハッシュは全く違うものになる. -\item ハッシュ化したブロックの先頭から数えた0ビットの数がdifficultyより多ければ, そのブロックにnonceを埋め込み, ブロックを作る. -\item 2の条件に当てはまらなかった場合はnonceに1を足して, 1からやり直す. +\item ブロックとnonceを加えたものをハッシュ化する.この際, nonceによって, ブロックのハッシュは全く違うものになる. +\item ハッシュ化したブロックの先頭から数えた0ビットの数がdifficultyより多ければ, そのブロックにnonceを埋め込み, ブロックを作る. +\item 2の条件に当てはまらなかった場合はnonceに1を足して, 1からやり直す. \end{enumerate} -difficulty = 2でProof of Workの手順を図にしたものを図3.1に示す. %refで +difficulty = 2でProof of Workの手順を図にしたものを図\ref{pic:proof}に示す.%refで + +\begin{figure}[ht] +\includegraphics[width=240pt]{images/proof-of-work.pdf} +\caption{Proof of Workの手順} +\label{pic:proof} +\end{figure} -\begin{figure}[h] +2の条件については,単純に(桁数 - difficulty + 1) * 10 $>$ hash とも置き換えることができる. +nonceを変えていくことで,hashはほぼ乱数のような状態になる. +つまり,difficultyを増やすほど,条件に当てはまるhashが少なくなっていくことがわかり, +そのhashを探すための計算量も増えることがわかる. +これがProof of Workでブロックを生成する手順となる. +これを用いることによって,ブロックが長くなるほど, すでに作られたブロックを変更することは計算量が膨大になるため, +不可能になっていく.Proof of Workでノード間のコンセンサスを取る方法は単純で, ブロックの長さの差が一定以上になった場合に +長かったブロックを正しいものとする.これを図で示すと\ref{コンセンサス}のようになる. + +\begin{figure}[ht] \begin{center} -\includegraphics[width=240pt]{images/proof-of-work.pdf} -\caption{proof-of-workの例} +\includegraphics[width=240pt]{images/proof-of-work-fork.pdf} +\caption{Proof of Workのコンセンサス} +\label{コンセンサス} \end{center} \end{figure} -2の条件については,単純に(桁数 - difficulty + 1) * 10 $>$ hash とも置き換えることができる. -nonceを変えていくことで,hashはほぼ乱数のような状態になる. -つまり,difficultyを増やすほど,条件に当てはまるhashが少なくなっていくことがわかり, -そのhashを探すための計算量も増えることがわかる. -これがProof of Workでブロックを生成する手順となる. -これを用いることによって,ブロックが長くなるほど, すでに作られたブロックを変更することは計算量が膨大になるため, -不可能になっていく. Proof of Workでノード間のコンセンサスを取る方法は単純で, ブロックの長さの差が一定以上になった場合に -長かったブロックを正しいものとする.これを図で示すと3.2のようになる. +計算量の差が51\%以上になると,forkしたブロック同士で差が生まれる. +それによってIPアドレスでのコンセンサではなく, CPUの性能によるコンセンサスを取ることができる. -\begin{figure}[h] -\begin{center} -\includegraphics[width=240pt]{images/proof-of-work-fork.pdf} -\caption{Proof of Workのコンセンサス} -\end{center} -\end{figure} +コンセンサスでは, ブロックとの差が大きければ大きいほど, コンセンサスが正確に取れる. +しかし,正しいチェーンが決まるのに時間がかかる. +そのため, コンセンサスに必要なブロックの差はコンセンサスの正確性と時間のトレードオフになっている. -計算量の差が51\%以上になると,forkしたブロック同士で差が生まれる. -それによってIPアドレスでのコンセンサではなく, CPUの性能によるコンセンサスを取ることができる. - -コンセンサスでは, ブロックとの差が大きければ大きいほど, コンセンサスが正確に取れる. -しかし,正しいチェーンが決まるのに時間がかかる. -そのため, コンセンサスに必要なブロックの差はコンセンサスの正確性と時間のトレードオフになっている. - -この方法でコンセンサスを取る場合の欠点を挙げる. +この方法でコンセンサスを取る場合の欠点を挙げる. \begin{itemize} -\item CPUのリソースを使用する. -\item Transactionが確定するのに時間がかかる. +\item CPUのリソースを使用する. +\item Transactionが確定するのに時間がかかる. \end{itemize} \section{Paxos} -コンソーシアムブロックチェーンは許可したのノードのみが参加できるブロックチェーンである. -そのため, ノードの数も把握できるため,Paxosを使うことができる. -Paxosはノードの多数決によってコンセンサスを取るアルゴリズムである. ただし, Paxosは次のような問題があっても値を一意に決めることができる. +コンソーシアムブロックチェーンは許可したのノードのみが参加できるブロックチェーンである. +そのため, ノードの数も把握できるため,Paxosを使うことができる. +Paxosはノードの多数決によってコンセンサスを取るアルゴリズムである.ただし, Paxosは次のような問題があっても値を一意に決めることができる. \begin{enumerate} -\item プロセス毎に処理の速度が違う. つまり, メッセージの返信が遅い可能性がある -\item 通信にどれだけの時間がかかるかわからず, その途中でメッセージが失われる可能性がある -\item プロセスは停止する可能性がある. また, 復旧する可能性もある +\item プロセス毎に処理の速度が違う.つまり, メッセージの返信が遅い可能性がある +\item 通信にどれだけの時間がかかるかわからず, その途中でメッセージが失われる可能性がある +\item プロセスは停止する可能性がある.また, 復旧する可能性もある \end{enumerate} -Proof of Workにある特性の4がないが, コンソーシアムブロックチェーンは3つの問題を解決するだけで十分である. -何故ならば,コンソーシアムブロックチェーンは許可したノードのみが参加可能だからである. つまり, 悪意あるノードが参加する可能性が少ないためである. -Paxosは3つの役割ノードがある. +Proof of Workにある特性の4がないが, コンソーシアムブロックチェーンは3つの問題を解決するだけで十分である. +何故ならば,コンソーシアムブロックチェーンは許可したノードのみが参加可能だからである.つまり, 悪意あるノードが参加する可能性が少ないためである. +Paxosは3つの役割ノードがある. \begin{description} -\item[proposer] 値を提案するノード. -\item[acceptor] 値を決めるノード. -\item[learner] acceptorから値を集計し, 過半数以上のacceptorが持っている値を決める. +\item[proposer] 値を提案するノード. +\item[acceptor] 値を決めるノード. +\item[learner] acceptorから値を集計し,過半数以上のacceptorが持っている値を決める. \end{description} -Paxosのアルゴリズムの説明の前に, 定義された用語の解説をする. いかにその用語の定義を示す. +Paxosのアルゴリズムの説明の前に,定義された用語の解説をする.いかにその用語の定義を示す. \begin{description} -\item[提案] 提案は, 異なる提案ごとにユニークな提案番号と値からなる. 提案番号とは, 異なる提案を見分けるための識別子であり単調増加する. -値は一意に決まってほしいデータである. +\item[提案] 提案は,異なる提案ごとにユニークな提案番号と値からなる.提案番号とは, 異なる提案を見分けるための識別子であり単調増加する. +値は一意に決まってほしいデータである. \item[値(提案)がacceptされる] acceptorによって値(提案)が決まること -\item[値(提案)が選択(chosen)される] 過半数以上のacceptorによって, 値(提案)がacceptされた場合, それを値(提案)が選択されたと言う +\item[値(提案)が選択(chosen)される] 過半数以上のacceptorによって, 値(提案)がacceptされた場合, それを値(提案)が選択されたと言う \end{description} -paxosのアルゴリズムは2フェーズある. -1つ目のフェーズ, prepare-promiseは次のような手順で動作する. +paxosのアルゴリズムは2フェーズある. +1つ目のフェーズ, prepare-promiseは次のような手順で動作する. -1フェーズ目を図にしたものを図3.3に示す. +1フェーズ目を図にしたものを図\ref{Proof of Workのコンセンサス}に示す. -\begin{figure}[h] +\begin{figure}[ht] \begin{center} \includegraphics[width=240pt]{images/prepare-promise.pdf} \caption{Proof of Workのコンセンサス} @@ -407,89 +407,89 @@ \end{figure} -2つ目のフェーズ, accept-acceptedは次のような手順で動作する. +2つ目のフェーズ,accept-acceptedは次のような手順で動作する. \begin{enumerate} -\item proposerは過半数のacceptorから返信が来たならば, 次の提案をacceptorに送る. これをacceptリクエストという. +\item proposerは過半数のacceptorから返信が来たならば,次の提案をacceptorに送る.これをacceptリクエストという. \begin{enumerate} -\item もし, 約束のみが返ってきているならば, 任意の値vをprepareリクエストで送った提案に設定する. -\item もし, acceptされた提案が返ってきたら, その中で最大の提案番号を持つ提案の値v'をprepareリクエストで送った提案の値として設定する. +\item もし,約束のみが返ってきているならば,任意の値vをprepareリクエストで送った提案に設定する. +\item もし,acceptされた提案が返ってきたら,その中で最大の提案番号を持つ提案の値v'をprepareリクエストで送った提案の値として設定する. \end{enumerate} -\item acceptorはacceptリクエストが来た場合, Promiseした提案よりもacceptリクエストで提案された提案番号が低ければ, その提案を拒否する. それ以外の場合はacceptする. +\item acceptorはacceptリクエストが来た場合,Promiseした提案よりもacceptリクエストで提案された提案番号が低ければ,その提案を拒否する.それ以外の場合はacceptする. \end{enumerate} -2フェーズ目を図にしたものを図3.4に示す. +2フェーズ目を図にしたものを図3.4に示す. -\begin{figure}[h] +\begin{figure}[ht] \begin{center} \includegraphics[width=240pt]{images/accept-accepted.pdf} \caption{Proof of Workのコンセンサス} \end{center} \end{figure} -このアルゴリズムによって,各acccepterごとに値が一意の決まる.値を集計,選択するのはLearnerの役割である.Learnerが値を集計する方法には2つの方法である. +このアルゴリズムによって,各acccepterごとに値が一意の決まる.値を集計,選択するのはLearnerの役割である.Learnerが値を集計する方法には2つの方法である. \begin{enumerate} -\item Acceptorによって値がacceptされた時に, 各Learnerに送信される. ただし, Message通信量が, Acceptorの数 times Learnerの数になる. -\item 1つのLearnerが各Learnerに選択された値を送信する. 1の方法に比べてMessage通信量が少なくなる(Acceptorの数 + Learnerの数になる)代わりに, そのLearnerが故障した場合は各LearnerがMessageを受け取れない. +\item Acceptorによって値がacceptされた時に,各Learnerに送信される.ただし,Message通信量が,Acceptorの数 times Learnerの数になる. +\item 1つのLearnerが各Learnerに選択された値を送信する.1の方法に比べてMessage通信量が少なくなる(Acceptorの数 + Learnerの数になる)代わりに,そのLearnerが故障した場合は各LearnerがMessageを受け取れない. \end{enumerate} -2つの方法はメッセージ通信量と耐障害性のトレードオフになっていることがわかる. -Paxosでコンセンサスを取ることは, Proof of Workと比較して次のようなメリットがある. +2つの方法はメッセージ通信量と耐障害性のトレードオフになっていることがわかる. +Paxosでコンセンサスを取ることは,Proof of Workと比較して次のようなメリットがある. \begin{itemize} \item CPUのリソースを消費しない -\item Transactionの確定に時間がかからない. +\item Transactionの確定に時間がかからない. \end{itemize} %\subsection{Paxosによるブロックチェーン} -PaxosはProof of Workと比べ,CPUのリソースを消費せず,Transactionの確定に時間がかからない. -そのため,Paxosでブロックのコンセンサスを取るブロックチェーンを実装することにはメリットがある. -また,Paxos自体がリーダー選出に向いているアルゴリズムである. -そのため,リーダーを決め,そのノードのブロックチェーンの一貫性のみを考えることもできる. +PaxosはProof of Workと比べ,CPUのリソースを消費せず,Transactionの確定に時間がかからない. +そのため,Paxosでブロックのコンセンサスを取るブロックチェーンを実装することにはメリットがある. +また,Paxos自体がリーダー選出に向いているアルゴリズムである. +そのため,リーダーを決め,そのノードのブロックチェーンの一貫性のみを考えることもできる. \section{Chrisiteにおけるブロックチェーンの実装の利点と欠点} -Christieにおいてブロック, トランザクション, Paxos, Proof of Workを実装した. -その際, Christieで実装した場合には以下のような利点がある. +Christieにおいてブロック,トランザクション,Paxos,Proof of Workを実装した. +その際,Christieで実装した場合には以下のような利点がある. \begin{itemize} -\item データの取り出しが簡単. ChristieはDataGearという単位でデータを保持する. そのため, ブロックやトランザクションはDataGearに包めばいいため, どう送るかという問題を考えなくてすむ. -\item TopologyManagerでのテストが便利. dotファイルが有れば, TopologyManagerが任意の形でTopologyを作れる. そのため, ノードの配置については理想の環境を作れるため, 理想のテスト環境を作ることができる. -\item 機能ごとにファイルが実装できるため, 見通しが良い. ChristieはCbCのgotoと同じように関数が終わるとsetupによって別の関数に移動する. そのため自然に機能ごとにファイルを作るため, 見通しが良くなる. +\item データの取り出しが簡単.ChristieはDataGearという単位でデータを保持する.そのため,ブロックやトランザクションはDataGearに包めばいいため,どう送るかという問題を考えなくてすむ. +\item TopologyManagerでのテストが便利.dotファイルが有れば,TopologyManagerが任意の形でTopologyを作れる.そのため,ノードの配置については理想の環境を作れるため,理想のテスト環境を作ることができる. +\item 機能ごとにファイルが実装できるため,見通しが良い.ChristieはCbCのgotoと同じように関数が終わるとsetupによって別の関数に移動する.そのため自然に機能ごとにファイルを作るため,見通しが良くなる. \end{itemize} -一方で、Christie には以下の問題点があることがわかった。 +一方で,Christie には以下の問題点があることがわかった. \begin{itemize} -\item デバッグが難しい. cgm.setupでCodeGearが実行されるが, keyの待ち合わせで止まり, どこのCGで止まっているかわからないことが多かった. -例えば, putするkeyのスペルミスでコードの待ち合わせが起こり, CGが実行されず, エラーなども表示されずにwaitすることがある. その時に, どこで止まっているか特定するのが難しい. -\item TakeFrom, PeekFromの使い方が難しい. TakeFrom, PeekFromは引数でDGM nameを指定する. しかし, DGMの名前を静的に与えるよりも, 動的に与えたい場合が多かった. -\item Takeの待ち合わせでCGが実行されない. 2つのCGで同じ変数をTakeしようとすると, setupされた時点で変数がロックされる. このとき, 片方のCGはDGがすべて揃っているのに, すべての変数が揃っていないもう片方のCGに同名の変数がロックされ, 実行されない場合がある. +\item デバッグが難しい.cgm.setupでCodeGearが実行されるが,keyの待ち合わせで止まり,どこのCGで止まっているかわからないことが多かった. +例えば, putするkeyのスペルミスでコードの待ち合わせが起こり,CGが実行されず,エラーなども表示されずにwaitすることがある.その時に,どこで止まっているか特定するのが難しい. +\item TakeFrom,PeekFromの使い方が難しい.TakeFrom,PeekFromは引数でDGM nameを指定する.しかし,DGMの名前を静的に与えるよりも,動的に与えたい場合が多かった. +\item Takeの待ち合わせでCGが実行されない.2つのCGで同じ変数をTakeしようとすると,setupされた時点で変数がロックされる.このとき, 片方のCGはDGがすべて揃っているのに,すべての変数が揃っていないもう片方のCGに同名の変数がロックされ, 実行されない場合がある. \end{itemize} \section{実験} -本研究室では, 実際にコンセンサスアルゴリズムPaxosをPC上に分散環境を実装して検証した。 -分散環境場で動かすため,JobSchedulerの一種であるTorque Resource Manager(Torque)を使用した. +本研究室では, 実際にコンセンサスアルゴリズムPaxosをPC上に分散環境を実装して検証した. +分散環境場で動かすため,JobSchedulerの一種であるTorque Resource Manager(Torque)を使用した. %\subsection{Torqueとは} -PCクラスタ上でプログラムの実験を行う際には,他のプログラムとリソースを取り合う懸念がある. -それを防ぐためにTorqueを使用する. -Torqueはjobという単位でプログラムを管理し,リソースを確保できたら実行する. -jobはqsubというコマンドを使って, 複数登録することができる. +PCクラスタ上でプログラムの実験を行う際には,他のプログラムとリソースを取り合う懸念がある. +それを防ぐためにTorqueを使用する. +Torqueはjobという単位でプログラムを管理しリソースを確保できたら実行する. +jobはqsubというコマンドを使って,複数登録することができる. -また, 実行中の様子もqstatというコマンドを使うことで監視ができる. -Torqueには主に3つのNodeの種類がある. +また, 実行中の様子もqstatというコマンドを使うことで監視ができる. +Torqueには主に3つのNodeの種類がある. \begin{description} -\item[Master Node] pbs\_serverを実行しているノード. 他のノードの役割とも併用できる. -\item[Submit/Interactive Nodes] クライアントがjobを投入したり監視したりするノード. qsubやqstatのようなクライアントコマンドが実行できる. -\item[Computer Nodes] 投入されたjobを実際に実行するノード. pbs\_momが実行されており, それによってjobをstart, kill, 管理する. +\item[Master Node] pbs\_serverを実行しているノード.他のノードの役割とも併用できる. +\item[Submit/Interactive Nodes] クライアントがjobを投入したり監視したりするノード.qsubやqstatのようなクライアントコマンドが実行できる. +\item[Computer Nodes] 投入されたjobを実際に実行するノード. pbs\_momが実行されており,それによってjobをstart,kill,管理する. \end{description} -今回は図\ref{fig:kvm}のように,KVM上にMaster Node, Submit/Interactive Nodeの役割を持つVM1台と,Computer Nodesとして15台のVMうぶbを用意し,jobの投入を行なった. +今回は図\ref{fig:kvm}のように,KVM上にMaster Node, Submit/Interactive Nodeの役割を持つVM1台と,Computer Nodesとして15台のVMうぶbを用意し,jobの投入を行なった. -\begin{figure}[h] +\begin{figure}[ht] \begin{center} \includegraphics[width=240pt]{images/kvm.pdf} \caption{実験環境} @@ -497,45 +497,45 @@ \label{fig:kvm} \end{figure} -jobはシェルスクリプトの形で与えることができる.ソースコードref{code:torque-example}を例として挙げる. - -\lstinputlisting[caption=torque-example.sh,label=code:torque-example]{src/torque-example.sh} +jobはシェルスクリプトの形で与えることができる.ソースコード\ref{code:torque-example}を例として挙げる. -「\#PBS オプション」とすることにより実行環境を設定できる. 使用できるオプションは参考文献に書かれてある. %いらなさそう + 参考文献の番号が必要 -このスクリプトでは, ノード数10(vm0からvm9まで), jobの名前を「ExampleJob」という形で実行する設定をしている. もし, このコードを投入した場合, Submit/Interactive Nodesが各vmにsshし, hostnameコマンドを実行する. -実行後はstdout, stderrorの出力を「job名.o数字」, 「job名.e数字」というファイルに書き出す. +\lstinputlisting[caption=torque-example.sh,label=code:torque-example]{./src/torque-example.sh} + +このスクリプトでは,ノード数10(vm0からvm9まで),jobの名前を「ExampleJob」という形で実行する設定をしている.もし, このコードを投入した場合,Submit/Interactive Nodesが各vmにsshし,hostnameコマンドを実行する. +実行後はstdout,stderrorの出力を「job名.o数字」, job名.e数字」というファイルに書き出す. %\subsection{PCクラスタ上でのPaxosの実際の動作} -PCクラスタ上で実際にPaxosを動かした際の解説をする. -今回は単純化し, proposerの数を2, accepterの数を3, learnerの数を1としてPaxosを動かし, 値が一意に決まる過程を見る. -実験の単純化の為に, 提案の数値を整数とし, 各processerごとに異なった値とした. -正確には, 「proposer + 数字」の部分を値とし, コンセンサスを取るようにした.実際にPaxosを動かし, シーケンス図で結果を示したものが図\ref{fig:paxos}である. +PCクラスタ上で実際にPaxosを動かした際の解説をする. +今回は単純化し,proposerの数を2,accepterの数を3,learnerの数を1としてPaxosを動かし,値が一意に決まる過程を見る. +実験の単純化の為に,提案の数値を整数とし,各processerごとに異なった値とした. +正確には,「proposer + 数字」の部分を値とし,コンセンサスを取るようにした.実際にPaxosを動かし,シーケンス図で結果を示したものが図\ref{fig:paxos}である. -\begin{figure*}[h] -\begin{center} +\begin{figure}[ht] \includegraphics[width=20cm]{images/paxos1.pdf} \caption{Paxos動作を表したシーケンス図} -\end{center} \label{fig:paxos} -\end{figure*} +\end{figure} -一意の値を決めることができており, また, Learnerが値を選択した後でも, Paxosは常に決めた値を持ち続けるアルゴリズムである.ログの出力では提案番号がより大きいものの提案まで続いていたが, 値がこれ以上覆らなかった。 -今回はわかりやすいよう値を数字で行なった実験であるが, これをタランザクション, ブロックに応用することで, ブロックチェーンにおけるコンセンサス部分を完成させることができる. +一意の値を決めることができており,また,Learnerが値を選択した後でも,Paxosは常に決めた値を持ち続けるアルゴリズムである.ログの出力では提案番号がより大きいものの提案まで続いていたが,値がこれ以上覆らなかった. +今回はわかりやすいよう値を数字で行なった実験であるが,これをタランザクション,ブロックに応用することで,ブロックチェーンにおけるコンセンサス部分を完成させることができる. % \section{計測実験} \section{まとめ} -Paxos の動作は確認したが, 計測実験を行うには至っていない. トランザクションの速度がノード数にどのように -影響されるのかを調べる必要がある. +Paxos の動作は確認したが,計測実験を行うには至っていない.トランザクションの速度がノード数にどのように +影響されるのかを調べる必要がある. + +Christie のToplogy Manager は実験するノードの設定を行う集中制御ノードであり,本来集中制御部分を持たない +ブロックチェーンとの相性は良くない. しかし,分散ファイルシステム等の用途の場合は Topology Manager の +ような方法の方がノードの管理が可能な利点がある. -Christie のToplogy Manager は実験するノードの設定を行う集中制御ノードであり, 本来集中制御部分を持たない -ブロックチェーンとの相性は良くない. しかし, 分散ファイルシステム等の用途の場合は Topology Manager の -ような方法の方がノードの管理が可能な利点がある. +今後は実装を進め,Gears OSでのファイルシステムへの応用などを考えていきたい. -今後は実装を進め, Gears OSでのファイルシステムへの応用などを考えていきたい. - - - +\begin{thebibliography}{9} +\bibitem{aka}赤堀 貴一,河野真治 : \textbf{Christieによるブロックチェーンの実装}.琉球大学工学部情報工学科卒業論文 2019. +\bibitem{latex}照屋 のぞみ,河野真治 : \textbf{分散フレームワークChristieの設計}.琉球大学理工学研究科修士論文 2018. +\label{teru} +\end{thebibliography} \end{document}