From 95c614fb95453ba55991544a66f57316ce786cb1 Mon Sep 17 00:00:00 2001 From: Maxwell Friedman Date: Thu, 24 Sep 2026 09:52:57 -0400 Subject: [PATCH] Add files via upload --- IEEEtran.bst | 2365 +++++++++++++++++++++++++++++++++++ abstract.tex | 5 + cornell.cls | 367 ++++++ devopsAIAgentGuide.tex | 107 ++ devopsAIPromptLog.tex | 14 + devopsAssignment.tex | 132 ++ devopsDocumentGuide.tex | 142 +++ devopsDocumentHistory.tex | 22 + devopsExampleAssignment.tex | 126 ++ devopsGlossary.tex | 13 + devopsIntroduction.tex | 47 + devopsReferences.bib | 6 + digitalOceanDocker.tex | 3 + latexDocker.tex | 3 + linuxCommands.tex | 338 +++++ projectProposal.tex | 3 + prologue.tex | 25 + terminal.png | Bin 0 -> 81528 bytes 18 files changed, 3718 insertions(+) create mode 100644 IEEEtran.bst create mode 100644 abstract.tex create mode 100644 cornell.cls create mode 100644 devopsAIAgentGuide.tex create mode 100644 devopsAIPromptLog.tex create mode 100644 devopsAssignment.tex create mode 100644 devopsDocumentGuide.tex create mode 100644 devopsDocumentHistory.tex create mode 100644 devopsExampleAssignment.tex create mode 100644 devopsGlossary.tex create mode 100644 devopsIntroduction.tex create mode 100644 devopsReferences.bib create mode 100644 digitalOceanDocker.tex create mode 100644 latexDocker.tex create mode 100644 linuxCommands.tex create mode 100644 projectProposal.tex create mode 100644 prologue.tex create mode 100644 terminal.png diff --git a/IEEEtran.bst b/IEEEtran.bst new file mode 100644 index 0000000..b9c3b93 --- /dev/null +++ b/IEEEtran.bst @@ -0,0 +1,2365 @@ +%% +%% IEEEtran.bst +%% BibTeX Bibliography Style file for IEEE Journals and Conferences (unsorted) +%% Version 1.10 (2002/09/27) +%% +%% Copyright (c) 2002 Michael Shell +%% +%% Original starting code base and algorithms obtained from the output of +%% Patrick W. Daly's makebst package as well as from prior versions of +%% IEEE BibTeX styles: +%% +%% 1. Howard Trickey and Oren Patashnik's ieeetr.bst (1985/1988) +%% 2. Silvano Balemi and Richard H. Roy's IEEEbib.bst (1993) +%% +%% +%% See: +%% http://www.ctan.org/tex-archive/macros/latex/contrib/supported/IEEEtran/ +%% for latest version and current contact information. +%% +%% For use with BibTeX version 0.99a or later +%% +%% This is a numerical citation style. +%% +%%********************************************************************** +%% Legal Notice: +%% This code is offered as-is without any warranty either expressed or +%% implied; without even the implied warranty of MERCHANTABILITY or +%% FITNESS FOR A PARTICULAR PURPOSE! +%% User assumes all risk. +%% In no event shall IEEE or any contributor to this code be liable for +%% any damages or losses, including, but not limited to, incidental, +%% consequential, or any other damages, resulting from the use or misuse +%% of any information contained here. +%% +%% This code is distributed under the Perl Artistic License +%% ( http://language.perl.com/misc/Artistic.html ) +%% and may be freely used, distributed and modified - subject to the +%% constraints therein. +%% Retain all contribution notices, credits and disclaimers. +%% +%% All comments are the opinions of their respective authors and are not +%% necessarily endorsed by the IEEE. +%%********************************************************************** +% +% +% Changelog: +% +% 1.00 (2002/08/13) Initial release +% +% 1.10 (2002/09/27) +% 1. Corrected minor bug for improperly formed warning message when a +% book was not given a title. Thanks to Ming Kin Lai for reporting this. +% 2. Added support for CTLname_format_string and CTLname_latex_cmd fields +% in the BST control entry type. + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% DEFAULTS FOR THE CONTROLS OF THE BST STYLE %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% These are the defaults for the user adjustable controls. The values used +% here can be overridden by the user via IEEEtranBSTCTL entry type. + +% NOTE: The recommended LaTeX command to invoke a control entry type is: +% +%\makeatletter +%\def\bstctlcite#1{\@bsphack +% \@for\@citeb:=#1\do{% +% \edef\@citeb{\expandafter\@firstofone\@citeb}% +% \if@filesw\immediate\write\@auxout{\string\citation{\@citeb}}\fi}% +% \@esphack} +%\makeatother +% +% It is called at the start of the document, before the first \cite, like: +% \bstctlcite{IEEEexample:BSTcontrol} +% +% IEEEtran.cls V1.6 and later does provide this command. + + + +% #0 turns off the display of the number for articles. +% #1 enables +FUNCTION {default.is.use.number.for.article} { #1 } + + +% #0 turns off the display of the paper and type fields in @inproceedings. +% #1 enables +FUNCTION {default.is.use.paper} { #1 } + + +% #0 turns off the forced use of "et al." +% #1 enables +FUNCTION {default.is.forced.et.al} { #0 } + +% The maximum number of names that can be present beyond which an "et al." +% usage is forced. Be sure that num.names.shown.with.forced.et.al (below) +% is not greater than this value! +% Note: There are many instances of references in IEEE journals which have +% a very large number of authors as well as instances in which "et al." is +% used profusely. +FUNCTION {default.max.num.names.before.forced.et.al} { #10 } + +% The number of names that will be shown with a forced "et al.". +% Must be less than or equal to max.num.names.before.forced.et.al +FUNCTION {default.num.names.shown.with.forced.et.al} { #1 } + + +% #0 turns off the alternate interword spacing for entries with URLs. +% #1 enables +FUNCTION {default.is.use.alt.interword.spacing} { #1 } + +% If alternate interword spacing for entries with URLs is enabled, this is +% the interword spacing stretch factor that will be used. For example, the +% default "4" here means that the interword spacing in entries with URLs can +% stretch to four times normal. Does not have to be an integer. Note that +% the value specified here can be overridden by the user in their LaTeX +% code via a command such as: +% "\providecommand\BIBentryALTinterwordstretchfactor{1.5}" in addition to +% that via the IEEEtranBSTCTL entry type. +FUNCTION {default.ALTinterwordstretchfactor} { "4" } + + +% #0 turns off the "dashification" of repeated (i.e., identical to those +% of the previous entry) names. IEEE normally does this. +% #1 enables +FUNCTION {default.is.dash.repeated.names} { #1 } + + +% The default name format control string. +FUNCTION {default.name.format.string}{ "{f.~}{vv~}{ll}{, jj}" } + + +% The default LaTeX font command for the names. +FUNCTION {default.name.latex.cmd}{ "" } + + +% Other controls that cannot be accessed via IEEEtranBSTCTL entry type. + +% #0 turns off the terminal startup banner/completed message so as to +% operate more quietly. +% #1 enables +FUNCTION {is.print.banners.to.terminal} { #1 } + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% FILE VERSION AND BANNER %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION{bst.file.version} { "1.10" } +FUNCTION{bst.file.date} { "2002/09/27" } +FUNCTION{bst.file.website} { "http://www.ctan.org/tex-archive/macros/latex/contrib/supported/IEEEtran/" } + +FUNCTION {banner.message} +{ is.print.banners.to.terminal + { "-- IEEEtran.bst version" " " * bst.file.version * + " (" * bst.file.date * ") " * "by Michael Shell." * + top$ + "-- " bst.file.website * + top$ + "-- See the " quote$ * "IEEEtran_bst_HOWTO.pdf" * quote$ * " manual for usage information." * + top$ + } + { skip$ } + if$ +} + +FUNCTION {completed.message} +{ is.print.banners.to.terminal + { "" + top$ + "Done." + top$ + } + { skip$ } + if$ +} + + + + +%%%%%%%%%%%%%%%%%%%%%% +%% STRING CONSTANTS %% +%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {bbl.and}{ "and" } +FUNCTION {bbl.etal}{ "et~al." } +FUNCTION {bbl.editors}{ "eds." } +FUNCTION {bbl.editor}{ "ed." } +FUNCTION {bbl.edition}{ "ed." } +FUNCTION {bbl.volume}{ "vol." } +FUNCTION {bbl.of}{ "of" } +FUNCTION {bbl.number}{ "no." } +FUNCTION {bbl.in}{ "in" } +FUNCTION {bbl.pages}{ "pp." } +FUNCTION {bbl.page}{ "p." } +FUNCTION {bbl.chapter}{ "ch." } +FUNCTION {bbl.paper}{ "paper" } +FUNCTION {bbl.part}{ "pt." } +FUNCTION {bbl.patent}{ "Patent" } +FUNCTION {bbl.patentUS}{ "U.S." } +FUNCTION {bbl.revision}{ "Rev." } +FUNCTION {bbl.series}{ "ser." } +FUNCTION {bbl.standard}{ "Std." } +FUNCTION {bbl.techrep}{ "Tech. Rep." } +FUNCTION {bbl.mthesis}{ "Master's thesis" } +FUNCTION {bbl.phdthesis}{ "Ph.D. dissertation" } +FUNCTION {bbl.urlprefix}{ "[Online]. Available:" } +FUNCTION {bbl.st}{ "st" } +FUNCTION {bbl.nd}{ "nd" } +FUNCTION {bbl.rd}{ "rd" } +FUNCTION {bbl.th}{ "th" } + + +% This is the LaTeX spacer that is used when a larger than normal space +% is called for (such as just before the address:publisher). +FUNCTION {large.space} { "\hskip 1em plus 0.5em minus 0.4em\relax " } + +% The LaTeX code for dashes that are used to represent repeated names. +% Note: Some older IEEE journals used something like +% "\rule{0.275in}{0.5pt}\," which is fairly thick and runs right along +% the baseline. However, IEEE now uses a thinner, above baseline, +% six dash long sequence. +FUNCTION {repeated.name.dashes} { "------" } + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% PREDEFINED STRING MACROS %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +MACRO {jan} {"Jan."} +MACRO {feb} {"Feb."} +MACRO {mar} {"Mar."} +MACRO {apr} {"Apr."} +MACRO {may} {"May"} +MACRO {jun} {"June"} +MACRO {jul} {"July"} +MACRO {aug} {"Aug."} +MACRO {sep} {"Sept."} +MACRO {oct} {"Oct."} +MACRO {nov} {"Nov."} +MACRO {dec} {"Dec."} + + + +%%%%%%%%%%%%%%%%%% +%% ENTRY FIELDS %% +%%%%%%%%%%%%%%%%%% + +ENTRY + { address + assignee + author + booktitle + chapter + day + dayfiled + edition + editor + howpublished + institution + intype + journal + key + language + month + monthfiled + nationality + note + number + organization + pages + paper + publisher + school + series + revision + title + type + url + volume + year + yearfiled + CTLuse_article_number + CTLuse_paper + CTLuse_forced_etal + CTLmax_names_forced_etal + CTLnames_show_etal + CTLuse_alt_spacing + CTLalt_stretch_factor + CTLdash_repeated_names + CTLname_format_string + CTLname_latex_cmd + } + {} + { label } + + + + +%%%%%%%%%%%%%%%%%%%%%%% +%% INTEGER VARIABLES %% +%%%%%%%%%%%%%%%%%%%%%%% + +INTEGERS { prev.status.punct this.status.punct punct.std + punct.no punct.comma punct.period + prev.status.space this.status.space space.std + space.no space.normal space.large + prev.status.quote this.status.quote quote.std + quote.no quote.close + prev.status.nline this.status.nline nline.std + nline.no nline.newblock + status.cap cap.std + cap.no cap.yes} + +INTEGERS { longest.label.width multiresult nameptr namesleft number.label numnames } + +INTEGERS { is.use.number.for.article + is.use.paper + is.forced.et.al + max.num.names.before.forced.et.al + num.names.shown.with.forced.et.al + is.use.alt.interword.spacing + is.dash.repeated.names} + + +%%%%%%%%%%%%%%%%%%%%%% +%% STRING VARIABLES %% +%%%%%%%%%%%%%%%%%%%%%% + +STRINGS { bibinfo + longest.label + oldname + s + t + ALTinterwordstretchfactor + name.format.string + name.latex.cmd} + + + + +%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOW LEVEL FUNCTIONS %% +%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {initialize.controls} +{ default.is.use.number.for.article 'is.use.number.for.article := + default.is.use.paper 'is.use.paper := + default.is.forced.et.al 'is.forced.et.al := + default.max.num.names.before.forced.et.al 'max.num.names.before.forced.et.al := + default.num.names.shown.with.forced.et.al 'num.names.shown.with.forced.et.al := + default.is.use.alt.interword.spacing 'is.use.alt.interword.spacing := + default.is.dash.repeated.names 'is.dash.repeated.names := + default.ALTinterwordstretchfactor 'ALTinterwordstretchfactor := + default.name.format.string 'name.format.string := + default.name.latex.cmd 'name.latex.cmd := +} + + +% This IEEEtran.bst features a very powerful and flexible mechanism for +% controlling the capitalization, punctuation, spacing, quotation, and +% newlines of the formatted entry fields. (Note: IEEEtran.bst does not need +% or use the newline/newblock feature, but it has been implemented for +% possible future use.) The output states of IEEEtran.bst consist of +% multiple independent attributes and, as such, can be thought of as being +% vectors, rather than the simple scalar values ("before.all", +% "mid.sentence", etc.) used in most other .bst files. +% +% The more flexible and complex design used here was motivated in part by +% IEEE's rather unusual bibliography style. For example, IEEE ends the +% previous field item with a period and large space prior to the publisher +% address; the @electronic entry types use periods as inter-item punctuation +% rather than the commas used by the other entry types; and URLs are never +% followed by periods even though they are the last item in the entry. +% Although it is possible to accommodate these features with the conventional +% output state system, the seemingly endless exceptions make for convoluted, +% unreliable and difficult to maintain code. +% +% IEEEtran.bst's output state system can be easily understood via a simple +% illustration of two most recently formatted entry fields (on the stack): +% +% CURRENT_ITEM +% "PREVIOUS_ITEM +% +% which, in this example, is to eventually appear in the bibliography as: +% +% "PREVIOUS_ITEM," CURRENT_ITEM +% +% It is the job of the output routine to take the previous item off of the +% stack (while leaving the current item at the top of the stack), apply its +% trailing punctuation (including closing quote marks) and spacing, and then +% to write the result to BibTeX's output buffer: +% +% "PREVIOUS_ITEM," +% +% Punctuation (and spacing) between items is often determined by both of the +% items rather than just the first one. The presence of quotation marks +% further complicates the situation because, in standard English, trailing +% punctuation marks are supposed to be contained within the quotes. +% +% IEEEtran.bst maintains two output state (aka "status") vectors which +% correspond to the previous and current (aka "this") items. Each vector +% consists of several independent attributes which track punctuation, +% spacing, quotation, and newlines. Capitalization status is handled by a +% separate scalar because the format routines, not the output routine, +% handle capitalization and, therefore, there is no need to maintain the +% capitalization attribute for both the "previous" and "this" items. +% +% When a format routine adds a new item, it copies the current output status +% vector to the previous output status vector and (usually) resets the +% current (this) output status vector to a "standard status" vector. Using a +% "standard status" vector in this way allows us to redefine what we mean by +% "standard status" at the start of each entry handler and reuse the same +% format routines under the various inter-item separation schemes. For +% example, the standard status vector for the @book entry type may use +% commas for item separators, while the @electronic type may use periods, +% yet both entry handlers exploit many of the exact same format routines. +% +% Because format routines have write access to the output status vector of +% the previous item, they can override the punctuation choices of the +% previous format routine! Therefore, it becomes trivial to implement rules +% such as "Always use a period and a large space before the publisher." By +% pushing the generation of the closing quote mark to the output routine, we +% avoid all the problems caused by having to close a quote before having all +% the information required to determine what the punctuation should be. +% +% The IEEEtran.bst output state system can easily be expanded if needed. +% For instance, it is easy to add a "space.tie" attribute value if the +% bibliography rules mandate that two items have to be joined with an +% unbreakable space. + +FUNCTION {initialize.status.constants} +{ #0 'punct.no := + #1 'punct.comma := + #2 'punct.period := + #0 'space.no := + #1 'space.normal := + #2 'space.large := + #0 'quote.no := + #1 'quote.close := + #0 'cap.no := + #1 'cap.yes := + #0 'nline.no := + #1 'nline.newblock := +} + +FUNCTION {std.status.using.comma} +{ punct.comma 'punct.std := + space.normal 'space.std := + quote.no 'quote.std := + nline.no 'nline.std := + cap.no 'cap.std := +} + +FUNCTION {std.status.using.period} +{ punct.period 'punct.std := + space.normal 'space.std := + quote.no 'quote.std := + nline.no 'nline.std := + cap.yes 'cap.std := +} + +FUNCTION {initialize.prev.this.status} +{ punct.no 'prev.status.punct := + space.no 'prev.status.space := + quote.no 'prev.status.quote := + nline.no 'prev.status.nline := + punct.no 'this.status.punct := + space.no 'this.status.space := + quote.no 'this.status.quote := + nline.no 'this.status.nline := + cap.yes 'status.cap := +} + +FUNCTION {this.status.std} +{ punct.std 'this.status.punct := + space.std 'this.status.space := + quote.std 'this.status.quote := + nline.std 'this.status.nline := +} + +FUNCTION {cap.status.std}{ cap.std 'status.cap := } + +FUNCTION {this.to.prev.status} +{ this.status.punct 'prev.status.punct := + this.status.space 'prev.status.space := + this.status.quote 'prev.status.quote := + this.status.nline 'prev.status.nline := +} + + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} + +FUNCTION {and} +{ { skip$ } + { pop$ #0 } + if$ +} + +FUNCTION {or} +{ { pop$ #1 } + { skip$ } + if$ +} + + +% convert the strings "yes" or "no" to #1 or #0 respectively +FUNCTION {yes.no.to.int} +{ "l" change.case$ duplicate$ + "yes" = + { pop$ #1 } + { duplicate$ "no" = + { pop$ #0 } + { "unknown boolean " quote$ * swap$ * quote$ * + " in " * cite$ * warning$ + #0 + } + if$ + } + if$ +} + + +% pushes true if the single char string on the stack is in the +% range of "0" to "9" +FUNCTION {is.num} +{ chr.to.int$ + duplicate$ "0" chr.to.int$ < not + swap$ "9" chr.to.int$ > not and +} + +% multiplies the integer on the stack by a factor of 10 +FUNCTION {bump.int.mag} +{ #0 'multiresult := + { duplicate$ #0 > } + { #1 - + multiresult #10 + + 'multiresult := + } + while$ +pop$ +multiresult +} + +% converts a single character string on the stack to an integer +FUNCTION {char.to.integer} +{ duplicate$ + is.num + { chr.to.int$ "0" chr.to.int$ - } + {"noninteger character " quote$ * swap$ * quote$ * + " in integer field of " * cite$ * warning$ + #0 + } + if$ +} + +% converts a string on the stack to an integer +FUNCTION {string.to.integer} +{ duplicate$ text.length$ 'namesleft := + #1 'nameptr := + #0 'numnames := + { nameptr namesleft > not } + { duplicate$ nameptr #1 substring$ + char.to.integer numnames bump.int.mag + + 'numnames := + nameptr #1 + + 'nameptr := + } + while$ +pop$ +numnames +} + + + + +% The output routines write out the *next* to the top (previous) item on the +% stack, adding punctuation and such as needed. Since IEEEtran.bst maintains +% the output status for the top two items on the stack, these output +% routines have to consider the previous output status (which corresponds to +% the item that is being output). Full independent control of punctuation, +% closing quote marks, spacing, and newblock is provided. +% +% "output.nonnull" does not check for the presence of a previous empty +% item. +% +% "output" does check for the presence of a previous empty item and will +% remove an empty item rather than outputing it. +% +% "output.warn" is like "output", but will issue a warning if it detects +% an empty item. + +FUNCTION {output.nonnull} +{ swap$ + prev.status.punct punct.comma = + { "," * } + { skip$ } + if$ + prev.status.punct punct.period = + { add.period$ } + { skip$ } + if$ + prev.status.quote quote.close = + { "''" * } + { skip$ } + if$ + prev.status.space space.normal = + { " " * } + { skip$ } + if$ + prev.status.space space.large = + { large.space * } + { skip$ } + if$ + write$ + prev.status.nline nline.newblock = + { newline$ "\newblock " write$ } + { skip$ } + if$ +} + +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} + +FUNCTION {output.warn} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull + if$ +} + +% "fin.entry" is the output routine that handles the last item of the entry +% (which will be on the top of the stack when "fin.entry" is called). + +FUNCTION {fin.entry} +{ this.status.punct punct.no = + { skip$ } + { add.period$ } + if$ + this.status.quote quote.close = + { "''" * } + { skip$ } + if$ +write$ +newline$ +} + + +FUNCTION {is.last.char.not.punct} +{ duplicate$ + "}" * add.period$ + #-1 #1 substring$ "." = +} + +FUNCTION {is.multiple.pages} +{ '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 {capitalize}{ "u" change.case$ "t" change.case$ } + +FUNCTION {emphasize} +{ duplicate$ empty$ + { pop$ "" } + { "\emph{" swap$ * "}" * } + if$ +} + +FUNCTION {do.name.latex.cmd} +{ name.latex.cmd + empty$ + { skip$ } + { name.latex.cmd "{" * swap$ * "}" * } + if$ +} + +% IEEEtran.bst uses its own \BIBforeignlanguage command which directly +% invokes the TeX hyphenation patterns without the need of the Babel +% package. Babel does a lot more than switch hyphenation patterns and +% its loading can cause unintended effects in many class files (such as +% IEEEtran.cls). +FUNCTION {select.language} +{ duplicate$ empty$ 'pop$ + { language empty$ 'skip$ + { "\BIBforeignlanguage{" language * "}{" * swap$ * "}" * } + if$ + } + if$ +} + +FUNCTION {tie.or.space.prefix} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ +} + +FUNCTION {get.bbl.editor} +{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ } + +FUNCTION {space.word}{ " " swap$ * " " * } + + +% Field Conditioners, Converters, Checkers and External Interfaces + +FUNCTION {empty.field.to.null.string} +{ duplicate$ empty$ + { pop$ "" } + { skip$ } + if$ +} + +FUNCTION {either.or.check} +{ empty$ + { pop$ } + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} + +FUNCTION {empty.entry.warn} +{ author empty$ title empty$ howpublished empty$ + month empty$ year empty$ note empty$ url empty$ + and and and and and and + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ +} + + +% The bibinfo system provides a way for the electronic parsing/acquisition +% of a bibliography's contents as is done by ReVTeX. For example, a field +% could be entered into the bibliography as: +% \bibinfo{volume}{2} +% Only the "2" would show up in the document, but the LaTeX \bibinfo command +% could do additional things with the information. IEEEtran.bst does provide +% a \bibinfo command via "\providecommand{\bibinfo}[2]{#2}". However, it is +% currently not used as the bogus bibinfo functions defined here output the +% entry values directly without the \bibinfo wrapper. The bibinfo functions +% themselves (and the calls to them) are retained for possible future use. +% +% bibinfo.check avoids acting on missing fields while bibinfo.warn will +% issue a warning message if a missing field is detected. Prior to calling +% the bibinfo functions, the user should push the field value and then its +% name string, in that order. + +FUNCTION {bibinfo.check} +{ swap$ duplicate$ missing$ + { pop$ pop$ "" } + { duplicate$ empty$ + { swap$ pop$ } + { swap$ pop$ } + if$ + } + if$ +} + +FUNCTION {bibinfo.warn} +{ swap$ duplicate$ missing$ + { swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ "" } + { duplicate$ empty$ + { swap$ "empty " swap$ * " in " * cite$ * warning$ } + { swap$ pop$ } + if$ + } + if$ +} + + +% IEEE separates large numbers with more than 4 digits into groups of +% three. IEEE uses a small space to separate these number groups. +% Typical applications include patent and page numbers. + +% number of consecutive digits required to trigger the group separation. +FUNCTION {large.number.trigger}{ #5 } + +% For numbers longer than the trigger, this is the blocksize of the groups. +% The blocksize must be less than the trigger threshold, and 2 * blocksize +% must be greater than the trigger threshold (can't do more than one +% separation on the initial trigger). +FUNCTION {large.number.blocksize}{ #3 } + +% What is actually inserted between the number groups. +FUNCTION {large.number.separator}{ "\," } + +% So as to save on integer variables by reusing existing ones, numnames +% holds the current number of consecutive digits read and nameptr holds +% the number that will trigger an inserted space. +FUNCTION {large.number.separate} +{ 't := + "" + #0 'numnames := + large.number.trigger 'nameptr := + { t empty$ not } + { t #-1 #1 substring$ is.num + { numnames #1 + 'numnames := } + { #0 'numnames := + large.number.trigger 'nameptr := + } + if$ + t #-1 #1 substring$ swap$ * + t #-2 global.max$ substring$ 't := + numnames nameptr = + { duplicate$ #1 nameptr large.number.blocksize - substring$ swap$ + nameptr large.number.blocksize - #1 + global.max$ substring$ + large.number.separator swap$ * * + nameptr large.number.blocksize - 'numnames := + large.number.blocksize #1 + 'nameptr := + } + { skip$ } + if$ + } + while$ +} + +% Converts all single dashes "-" to double dashes "--". +FUNCTION {n.dashify} +{ large.number.separate + '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$ +} + + +% This function detects entries with names that are identical to that of +% the previous entry and replaces the repeated names with dashes (if the +% "is.dash.repeated.names" user control is nonzero). +FUNCTION {name.or.dash} +{ 's := + oldname empty$ + { s 'oldname := s } + { s oldname = + { is.dash.repeated.names + { repeated.name.dashes } + { s 'oldname := s } + if$ + } + { s 'oldname := s } + if$ + } + if$ +} + +% Converts the number string on the top of the stack to +% "numerical ordinal form" (e.g., "7" to "7th"). There is +% no artificial limit to the upper bound of the numbers as the +% least significant digit always determines the ordinal form. +FUNCTION {num.to.ordinal} +{ duplicate$ #-1 #1 substring$ "1" = + { bbl.st * } + { duplicate$ #-1 #1 substring$ "2" = + { bbl.nd * } + { duplicate$ #-1 #1 substring$ "3" = + { bbl.rd * } + { bbl.th * } + if$ + } + if$ + } + if$ +} + +% If the string on the top of the stack begins with a number, +% (e.g., 11th) then replace the string with the leading number +% it contains. Otherwise retain the string as-is. s holds the +% extracted number, t holds the part of the string that remains +% to be scanned. +FUNCTION {extract.num} +{ duplicate$ 't := + "" 's := + { t empty$ not } + { t #1 #1 substring$ + t #2 global.max$ substring$ 't := + duplicate$ is.num + { s swap$ * 's := } + { pop$ "" 't := } + if$ + } + while$ + s empty$ + 'skip$ + { pop$ s } + if$ +} + +% Converts the word number string on the top of the stack to +% Arabic string form. Will be successful up to "tenth". +FUNCTION {word.to.num} +{ duplicate$ "l" change.case$ 's := + s "first" = + { pop$ "1" } + { skip$ } + if$ + s "second" = + { pop$ "2" } + { skip$ } + if$ + s "third" = + { pop$ "3" } + { skip$ } + if$ + s "fourth" = + { pop$ "4" } + { skip$ } + if$ + s "fifth" = + { pop$ "5" } + { skip$ } + if$ + s "sixth" = + { pop$ "6" } + { skip$ } + if$ + s "seventh" = + { pop$ "7" } + { skip$ } + if$ + s "eighth" = + { pop$ "8" } + { skip$ } + if$ + s "ninth" = + { pop$ "9" } + { skip$ } + if$ + s "tenth" = + { pop$ "10" } + { skip$ } + if$ +} + + +% Converts the string on the top of the stack to numerical +% ordinal (e.g., "11th") form. +FUNCTION {convert.edition} +{ duplicate$ empty$ 'skip$ + { duplicate$ #1 #1 substring$ is.num + { extract.num + num.to.ordinal + } + { word.to.num + duplicate$ #1 #1 substring$ is.num + { num.to.ordinal } + { "edition ordinal word " quote$ * edition * quote$ * + " may be too high (or improper) for conversion" * " in " * cite$ * warning$ + } + if$ + } + if$ + } + if$ +} + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LATEX BIBLIOGRAPHY CODE %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {start.entry} +{ newline$ + "\bibitem{" write$ + cite$ write$ + "}" write$ + newline$ + "" + initialize.prev.this.status +} + +% Here we write out all the LaTeX code that we will need. The most involved +% code sequences are those that control the alternate interword spacing and +% foreign language hyphenation patterns. The heavy use of \providecommand +% gives users a way to override the defaults. Special thanks to Javier Bezos, +% Johannes Braams, Robin Fairburns, Heiko Oberdiek, Donald Arseneau and all +% the other gurus on comp.text.tex for their help and advice on the topic of +% \selectlanguage, Babel and BibTeX. +FUNCTION {begin.bib} +{ preamble$ empty$ 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{" longest.label * "}" * + write$ newline$ + "\providecommand{\url}[1]{#1}" + write$ newline$ + "\def\UrlFont{\rmfamily}" + write$ newline$ + "\providecommand{\newblock}{\relax}" + write$ newline$ + "\providecommand{\bibinfo}[2]{#2}" + write$ newline$ + "\providecommand\BIBentrySTDinterwordspacing{\spaceskip=0pt\relax}" + write$ newline$ + "\providecommand\BIBentryALTinterwordstretchfactor{" + ALTinterwordstretchfactor * "}" * + write$ newline$ + "\providecommand\BIBentryALTinterwordspacing{\spaceskip=\fontdimen2\font plus " + write$ newline$ + "\BIBentryALTinterwordstretchfactor\fontdimen3\font minus \fontdimen4\font\relax}" + write$ newline$ + "\providecommand\BIBforeignlanguage[2]{{%" + write$ newline$ + "\expandafter\ifx\csname l@#1\endcsname\relax" + write$ newline$ + "\typeout{** WARNING: IEEEtran.bst: No hyphenation pattern has been}%" + write$ newline$ + "\typeout{** loaded for the language `#1'. Using the pattern for}%" + write$ newline$ + "\typeout{** the default language instead.}%" + write$ newline$ + "\else" + write$ newline$ + "\language=\csname l@#1\endcsname" + write$ newline$ + "\fi" + write$ newline$ + "#2}}" + write$ newline$ +} + +FUNCTION {end.bib} +{ newline$ "\end{thebibliography}" write$ newline$ } + +FUNCTION {if.url.alt.interword.spacing} +{ is.use.alt.interword.spacing + {url empty$ 'skip$ {"\BIBentryALTinterwordspacing" write$ newline$} if$} + { skip$ } + if$ +} + +FUNCTION {if.url.std.interword.spacing} +{ is.use.alt.interword.spacing + {url empty$ 'skip$ {"\BIBentrySTDinterwordspacing" write$ newline$} if$} + { skip$ } + if$ +} + + + + +%%%%%%%%%%%%%%%%%%%%%%%% +%% LONGEST LABEL PASS %% +%%%%%%%%%%%%%%%%%%%%%%%% + +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$ +} + + + + +%%%%%%%%%%%%%%%%%%%%% +%% FORMAT HANDLERS %% +%%%%%%%%%%%%%%%%%%%%% + +%% Lower Level Formats (used by higher level formats) + +FUNCTION {format.address.org.or.pub.date} +{ 't := + "" + year empty$ + { "empty year in " cite$ * warning$ } + { skip$ } + if$ + address empty$ t empty$ and + year empty$ and month empty$ and + { skip$ } + { this.to.prev.status + this.status.std + cap.status.std + address "address" bibinfo.check * + t empty$ + { skip$ } + { punct.period 'prev.status.punct := + space.large 'prev.status.space := + address empty$ + { skip$ } + { ": " * } + if$ + t * + } + if$ + year empty$ month empty$ and + { skip$ } + { t empty$ address empty$ and + { skip$ } + { ", " * } + if$ + month empty$ + { year empty$ + { skip$ } + { year "year" bibinfo.check * } + if$ + } + { month "month" bibinfo.check * + year empty$ + { skip$ } + { " " * year "year" bibinfo.check * } + if$ + } + if$ + } + if$ + } + if$ +} + + +FUNCTION {format.names} +{ 'bibinfo := + duplicate$ empty$ 'skip$ { + this.to.prev.status + this.status.std + 's := + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + name.format.string + format.name$ + bibinfo bibinfo.check + 't := + nameptr #1 > + { nameptr num.names.shown.with.forced.et.al #1 + = + numnames max.num.names.before.forced.et.al > + is.forced.et.al and and + { "others" 't := + #1 'namesleft := + } + { skip$ } + if$ + namesleft #1 > + { ", " * t do.name.latex.cmd * } + { + numnames #2 > + { "," * } + 'skip$ + if$ + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + t "others" = + { + " " * bbl.etal emphasize * + } + { + bbl.and + space.word * t do.name.latex.cmd * + } + if$ + } + if$ + } + { t do.name.latex.cmd } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + cap.status.std + } if$ +} + + + + +%% Higher Level Formats + +%% addresses/locations + +FUNCTION {format.address} +{ address duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + + + +%% author/editor names + +FUNCTION {format.authors}{ author "author" format.names } + +FUNCTION {format.editors} +{ editor "editor" format.names duplicate$ empty$ 'skip$ + { ", " * + get.bbl.editor + capitalize + * + } + if$ +} + + + +%% date + +FUNCTION {format.date} +{ + month "month" bibinfo.check duplicate$ empty$ + year "year" bibinfo.check duplicate$ empty$ + { swap$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + "there's a month but no year in " cite$ * warning$ } + if$ + * + } + { this.to.prev.status + this.status.std + cap.status.std + swap$ 'skip$ + { + swap$ + " " * swap$ + } + if$ + * + } + if$ +} + +FUNCTION {format.date.electronic} +{ month "month" bibinfo.check duplicate$ empty$ + year "year" bibinfo.check duplicate$ empty$ + { swap$ + { pop$ } + { "there's a month but no year in " cite$ * warning$ + pop$ ")" * "(" swap$ * + this.to.prev.status + punct.no 'this.status.punct := + space.normal 'this.status.space := + quote.no 'this.status.quote := + cap.yes 'status.cap := + } + if$ + } + { swap$ + { swap$ pop$ ")" * "(" swap$ * } + { "(" swap$ * ", " * swap$ * ")" * } + if$ + this.to.prev.status + punct.no 'this.status.punct := + space.normal 'this.status.space := + quote.no 'this.status.quote := + cap.yes 'status.cap := + } + if$ +} + + + +%% edition/title + +% Note: IEEE considers the edition to be closely associated with +% the title of a book. So, in IEEEtran.bst the edition is normally handled +% within the formatting of the title. The format.edition function is +% retained here for possible future use. +FUNCTION {format.edition} +{ edition duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + convert.edition + status.cap + { "t" } + { "l" } + if$ change.case$ + "edition" bibinfo.check + "~" * bbl.edition * + cap.status.std + } + if$ +} + +% This is used to format the booktitle of a conference proceedings. +% Here we use the "intype" field to provide the user a way to +% override the word "in" (e.g., with things like "presented at") +% Use of intype stops the emphasis of the booktitle to indicate that +% we no longer mean the written conference proceedings, but the +% conference itself. +FUNCTION {format.in.booktitle} +{ booktitle "booktitle" bibinfo.check duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + select.language + intype missing$ + { emphasize + bbl.in " " * + } + { intype " " * } + if$ + swap$ * + cap.status.std + } + if$ +} + +% This is used to format the booktitle of collection. +% Here the "intype" field is not supported, but "edition" is. +FUNCTION {format.in.booktitle.edition} +{ booktitle "booktitle" bibinfo.check duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + select.language + emphasize + edition empty$ 'skip$ + { ", " * + edition + convert.edition + "l" change.case$ + * "~" * bbl.edition * + } + if$ + bbl.in " " * swap$ * + cap.status.std + } + if$ +} + +FUNCTION {format.article.title} +{ title duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + "t" change.case$ + } + if$ + "title" bibinfo.check + duplicate$ empty$ 'skip$ + { quote.close 'this.status.quote := + is.last.char.not.punct + { punct.std 'this.status.punct := } + { punct.no 'this.status.punct := } + if$ + select.language + "``" swap$ * + cap.status.std + } + if$ +} + +FUNCTION {format.article.title.electronic} +{ title duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + "t" change.case$ + } + if$ + "title" bibinfo.check + duplicate$ empty$ + { skip$ } + { select.language } + if$ +} + +FUNCTION {format.book.title.edition} +{ title "title" bibinfo.check + duplicate$ empty$ + { "empty title in " cite$ * warning$ } + { this.to.prev.status + this.status.std + select.language + emphasize + edition empty$ 'skip$ + { ", " * + edition + convert.edition + status.cap + { "t" } + { "l" } + if$ + change.case$ + * "~" * bbl.edition * + } + if$ + cap.status.std + } + if$ +} + +FUNCTION {format.book.title} +{ title "title" bibinfo.check + duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + select.language + emphasize + } + if$ +} + + + +%% journal + +FUNCTION {format.journal} +{ journal duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + select.language + emphasize + } + if$ +} + + + +%% how published + +FUNCTION {format.howpublished} +{ howpublished duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + + + +%% institutions/organization/publishers/school + +FUNCTION {format.institution} +{ institution duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + +FUNCTION {format.organization} +{ organization duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + +FUNCTION {format.address.publisher.date} +{ publisher "publisher" bibinfo.warn format.address.org.or.pub.date } + +FUNCTION {format.address.publisher.date.nowarn} +{ publisher "publisher" bibinfo.check format.address.org.or.pub.date } + +FUNCTION {format.address.organization.date} +{ organization "organization" bibinfo.check format.address.org.or.pub.date } + +FUNCTION {format.school} +{ school duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + + + +%% volume/number/series/chapter/pages + +FUNCTION {format.volume} +{ volume empty.field.to.null.string + duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + bbl.volume + status.cap + { capitalize } + { skip$ } + if$ + swap$ tie.or.space.prefix + "volume" bibinfo.check + * * + cap.status.std + } + if$ +} + +FUNCTION {format.number} +{ number empty.field.to.null.string + duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + status.cap + { bbl.number capitalize } + { bbl.number } + if$ + swap$ tie.or.space.prefix + "number" bibinfo.check + * * + cap.status.std + } + if$ +} + +FUNCTION {format.number.if.use.for.article} +{ is.use.number.for.article + { format.number } + { "" } + if$ +} + +% IEEE does not seem to tie the series so closely with the volume +% and number as is done in other bibliography styles. Instead the +% series is treated somewhat like an extension of the title. +FUNCTION {format.series} +{ series empty$ + { "" } + { this.to.prev.status + this.status.std + bbl.series " " * + series "series" bibinfo.check * + cap.status.std + } + if$ +} + + +FUNCTION {format.chapter} +{ chapter empty$ + { "" } + { this.to.prev.status + this.status.std + type empty$ + { bbl.chapter } + { type "l" change.case$ + "type" bibinfo.check + } + if$ + chapter tie.or.space.prefix + "chapter" bibinfo.check + * * + cap.status.std + } + if$ +} + + +% The intended use of format.paper is for paper numbers of inproceedings. +% The paper type can be overridden via the type field. +% We allow the type to be displayed even if the paper number is absent +% for things like "postdeadline paper" +FUNCTION {format.paper} +{ is.use.paper + { paper empty$ + { type empty$ + { "" } + { this.to.prev.status + this.status.std + type "type" bibinfo.check + cap.status.std + } + if$ + } + { this.to.prev.status + this.status.std + type empty$ + { bbl.paper } + { type "type" bibinfo.check } + if$ + " " * paper + "paper" bibinfo.check + * + cap.status.std + } + if$ + } + { "" } + if$ +} + + +FUNCTION {format.pages} +{ pages duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + duplicate$ is.multiple.pages + { + bbl.pages swap$ + n.dashify + } + { + bbl.page swap$ + } + if$ + tie.or.space.prefix + "pages" bibinfo.check + * * + cap.status.std + } + if$ +} + + + +%% technical report number + +FUNCTION {format.tech.report.number} +{ number "number" bibinfo.check + type duplicate$ empty$ + { pop$ + this.to.prev.status + this.status.std + cap.status.std + bbl.techrep + } + { skip$ } + if$ + "type" bibinfo.check + swap$ duplicate$ empty$ + { pop$ } + { this.to.prev.status + this.status.std + cap.status.std + tie.or.space.prefix * * } + if$ +} + + + +%% note + +FUNCTION {format.note} +{ note empty$ + { "" } + { this.to.prev.status + this.status.std + punct.period 'this.status.punct := + note #1 #1 substring$ + duplicate$ "{" = + { skip$ } + { status.cap + { "u" } + { "l" } + if$ + change.case$ + } + if$ + note #2 global.max$ substring$ * "note" bibinfo.check + cap.yes 'status.cap := + } + if$ +} + + + +%% patent + +FUNCTION {format.patent.date} +{ this.to.prev.status + this.status.std + year empty$ + { monthfiled duplicate$ empty$ + { "monthfiled" bibinfo.check pop$ "" } + { "monthfiled" bibinfo.check } + if$ + dayfiled duplicate$ empty$ + { "dayfiled" bibinfo.check pop$ "" * } + { "dayfiled" bibinfo.check + monthfiled empty$ + { "dayfiled without a monthfiled in " cite$ * warning$ + * + } + { " " swap$ * * } + if$ + } + if$ + yearfiled empty$ + { "no year or yearfiled in " cite$ * warning$ } + { yearfiled "yearfiled" bibinfo.check + swap$ + duplicate$ empty$ + { pop$ } + { ", " * swap$ * } + if$ + } + if$ + } + { month duplicate$ empty$ + { "month" bibinfo.check pop$ "" } + { "month" bibinfo.check } + if$ + day duplicate$ empty$ + { "day" bibinfo.check pop$ "" * } + { "day" bibinfo.check + month empty$ + { "day without a month in " cite$ * warning$ + * + } + { " " swap$ * * } + if$ + } + if$ + year "year" bibinfo.check + swap$ + duplicate$ empty$ + { pop$ } + { ", " * swap$ * } + if$ + } + if$ + cap.status.std +} + +FUNCTION {format.patent.nationality.type.number} +{ this.to.prev.status + this.status.std + nationality duplicate$ empty$ + { "nationality" bibinfo.warn pop$ "" } + { "nationality" bibinfo.check + duplicate$ "l" change.case$ "united states" = + { pop$ bbl.patentUS } + { skip$ } + if$ + " " * + } + if$ + type empty$ + { bbl.patent "type" bibinfo.check } + { type "type" bibinfo.check } + if$ + * + number duplicate$ empty$ + { "number" bibinfo.warn pop$ } + { "number" bibinfo.check + large.number.separate + swap$ " " * swap$ * + } + if$ + cap.status.std +} + + + +%% standard + +FUNCTION {format.organization.institution.standard.type.number} +{ this.to.prev.status + this.status.std + organization duplicate$ empty$ + { pop$ + institution duplicate$ empty$ + { "institution" bibinfo.warn } + { "institution" bibinfo.warn " " * } + if$ + } + { "organization" bibinfo.warn " " * } + if$ + type empty$ + { bbl.standard "type" bibinfo.check } + { type "type" bibinfo.check } + if$ + * + number duplicate$ empty$ + { "number" bibinfo.check pop$ } + { "number" bibinfo.check + large.number.separate + swap$ " " * swap$ * + } + if$ + cap.status.std +} + +FUNCTION {format.revision} +{ revision empty$ + { "" } + { this.to.prev.status + this.status.std + bbl.revision + revision tie.or.space.prefix + "revision" bibinfo.check + * * + cap.status.std + } + if$ +} + + +%% thesis + +FUNCTION {format.master.thesis.type} +{ this.to.prev.status + this.status.std + type empty$ + { + bbl.mthesis + } + { + type "type" bibinfo.check + } + if$ +cap.status.std +} + +FUNCTION {format.phd.thesis.type} +{ this.to.prev.status + this.status.std + type empty$ + { + bbl.phdthesis + } + { + type "type" bibinfo.check + } + if$ +cap.status.std +} + + + +%% URL + +FUNCTION {format.url} +{ url empty$ + { "" } + { this.to.prev.status + this.status.std + cap.yes 'status.cap := + bbl.urlprefix " " * + "\url{" * url * "}" * + punct.no 'this.status.punct := + punct.period 'prev.status.punct := + space.normal 'this.status.space := + space.normal 'prev.status.space := + quote.no 'this.status.quote := + } + if$ +} + + + + +%%%%%%%%%%%%%%%%%%%% +%% ENTRY HANDLERS %% +%%%%%%%%%%%%%%%%%%%% + + +% Note: In many journals, IEEE (or the authors) tend not to show the number +% for articles, so the display of the number is controlled here by the +% switch "is.use.number.for.article" +FUNCTION {article} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.journal "journal" bibinfo.check "journal" output.warn + format.volume output + format.number.if.use.for.article output + format.pages output + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {book} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + author empty$ + { format.editors "author and editor" output.warn } + { format.authors output.nonnull } + if$ + name.or.dash + format.book.title.edition output + format.series output + author empty$ + { skip$ } + { format.editors output } + if$ + format.address.publisher.date output + format.volume output + format.number output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {booklet} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.article.title "title" output.warn + format.howpublished "howpublished" bibinfo.check output + format.organization "organization" bibinfo.check output + format.address "address" bibinfo.check output + format.date output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {electronic} +{ std.status.using.period + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.date.electronic output + format.article.title.electronic output + format.howpublished "howpublished" bibinfo.check output + format.organization "organization" bibinfo.check output + format.address "address" bibinfo.check output + format.note output + format.url output + fin.entry + empty.entry.warn + if.url.std.interword.spacing +} + +FUNCTION {inbook} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + author empty$ + { format.editors "author and editor" output.warn } + { format.authors output.nonnull } + if$ + name.or.dash + format.book.title.edition output + format.series output + format.address.publisher.date output + format.volume output + format.number output + format.chapter output + format.pages output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {incollection} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.in.booktitle.edition "booktitle" output.warn + format.series output + format.editors output + format.address.publisher.date.nowarn output + format.volume output + format.number output + format.chapter output + format.pages output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {inproceedings} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.in.booktitle "booktitle" output.warn + format.series output + format.editors output + format.volume output + format.number output + publisher empty$ + { format.address.organization.date output } + { format.organization "organization" bibinfo.check output + format.address.publisher.date output + } + if$ + format.paper output + format.pages output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {manual} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.book.title.edition "title" output.warn + format.howpublished "howpublished" bibinfo.check output + format.organization "organization" bibinfo.check output + format.address "address" bibinfo.check output + format.date output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {mastersthesis} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.master.thesis.type output.nonnull + format.school "school" bibinfo.warn output + format.address "address" bibinfo.check output + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {misc} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.article.title output + format.howpublished "howpublished" bibinfo.check output + format.organization "organization" bibinfo.check output + format.address "address" bibinfo.check output + format.pages output + format.date output + format.note output + format.url output + fin.entry + empty.entry.warn + if.url.std.interword.spacing +} + +FUNCTION {patent} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.article.title output + format.patent.nationality.type.number output + format.patent.date output + format.note output + format.url output + fin.entry + empty.entry.warn + if.url.std.interword.spacing +} + +FUNCTION {periodical} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.editors output + name.or.dash + format.book.title "title" output.warn + format.series output + format.volume output + format.number output + format.organization "organization" bibinfo.check output + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {phdthesis} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.phd.thesis.type output.nonnull + format.school "school" bibinfo.warn output + format.address "address" bibinfo.check output + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {proceedings} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.editors output + name.or.dash + format.book.title "title" output.warn + format.series output + format.volume output + format.number output + publisher empty$ + { format.address.organization.date output } + { format.organization "organization" bibinfo.check output + format.address.publisher.date output + } + if$ + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {standard} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.book.title "title" output.warn + format.howpublished "howpublished" bibinfo.check output + format.organization.institution.standard.type.number output + format.revision output + format.date output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {techreport} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.howpublished "howpublished" bibinfo.check output + format.institution "institution" bibinfo.warn output + format.address "address" bibinfo.check output + format.tech.report.number output.nonnull + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {unpublished} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.date output + format.note "note" output.warn + format.url output + fin.entry + if.url.std.interword.spacing +} + + +% The special entry type which provides the user interface to the +% BST controls +FUNCTION {IEEEtranBSTCTL} +{ is.print.banners.to.terminal + { "** IEEEtran BST control entry " quote$ * cite$ * quote$ * " detected." * + top$ + } + { skip$ } + if$ + CTLuse_article_number + empty$ + { skip$ } + { CTLuse_article_number + yes.no.to.int + 'is.use.number.for.article := + } + if$ + CTLuse_paper + empty$ + { skip$ } + { CTLuse_paper + yes.no.to.int + 'is.use.paper := + } + if$ + CTLuse_forced_etal + empty$ + { skip$ } + { CTLuse_forced_etal + yes.no.to.int + 'is.forced.et.al := + } + if$ + CTLmax_names_forced_etal + empty$ + { skip$ } + { CTLmax_names_forced_etal + string.to.integer + 'max.num.names.before.forced.et.al := + } + if$ + CTLnames_show_etal + empty$ + { skip$ } + { CTLnames_show_etal + string.to.integer + 'num.names.shown.with.forced.et.al := + } + if$ + CTLuse_alt_spacing + empty$ + { skip$ } + { CTLuse_alt_spacing + yes.no.to.int + 'is.use.alt.interword.spacing := + } + if$ + CTLalt_stretch_factor + empty$ + { skip$ } + { CTLalt_stretch_factor + 'ALTinterwordstretchfactor := + "\renewcommand\BIBentryALTinterwordstretchfactor{" + ALTinterwordstretchfactor * "}" * + write$ newline$ + } + if$ + CTLdash_repeated_names + empty$ + { skip$ } + { CTLdash_repeated_names + yes.no.to.int + 'is.dash.repeated.names := + } + if$ + CTLname_format_string + empty$ + { skip$ } + { CTLname_format_string + 'name.format.string := + } + if$ + CTLname_latex_cmd + empty$ + { skip$ } + { CTLname_latex_cmd + 'name.latex.cmd := + } + if$ + + + num.names.shown.with.forced.et.al max.num.names.before.forced.et.al > + { "CTLnames_show_etal cannot be greater than CTLmax_names_forced_etal in " cite$ * warning$ + max.num.names.before.forced.et.al 'num.names.shown.with.forced.et.al := + } + { skip$ } + if$ +} + + +%%%%%%%%%%%%%%%%%%% +%% ENTRY ALIASES %% +%%%%%%%%%%%%%%%%%%% +FUNCTION {conference}{inproceedings} +FUNCTION {online}{electronic} +FUNCTION {internet}{electronic} +FUNCTION {webpage}{electronic} +FUNCTION {default.type}{misc} + + + +%%%%%%%%%%%%%%%%%% +%% MAIN PROGRAM %% +%%%%%%%%%%%%%%%%%% + +READ + +EXECUTE {initialize.controls} +EXECUTE {initialize.status.constants} +EXECUTE {banner.message} + +EXECUTE {initialize.longest.label} +ITERATE {longest.label.pass} + +EXECUTE {begin.bib} +ITERATE {call.type$} +EXECUTE {end.bib} + +EXECUTE{completed.message} + + +%% That's all folks, mds. diff --git a/abstract.tex b/abstract.tex new file mode 100644 index 0000000..06de013 --- /dev/null +++ b/abstract.tex @@ -0,0 +1,5 @@ +This assignment guides students through a reproducible DevOps activity. It +defines the learning objectives, environment boundary, workflow, evidence, +reflection, and submission criteria. Replace bracketed text with assignment- +specific facts before release. Students should be able to recreate the work +from the submitted automation and runbook rather than from undocumented manual steps. diff --git a/cornell.cls b/cornell.cls new file mode 100644 index 0000000..79b37eb --- /dev/null +++ b/cornell.cls @@ -0,0 +1,367 @@ +%% +%% This is file `cornell.cls', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% cornell.dtx (with options: `class') +%% +%% IMPORTANT NOTICE: +%% +%% For the copyright see the source file. +%% +%% Any modified versions of this file must be renamed +%% with new filenames distinct from cornell.cls. +%% +%% For distribution of the original source see the terms +%% for copying and modification in the file cornell.dtx. +%% +%% This generated file may be distributed as long as the +%% original source files, as listed above, are part of the +%% same distribution. (The sources need not necessarily be +%% in the same archive or directory.) +%% Document class `cornell' to use with LaTeX 2e. +%% Based on `crnlphd' class. The following is from the file `crnlphd.dtx': +%% Based loosely on old cuphdthesis style file. +%% Found to give good results, according to the thesis secretary. +%% File: crnlphd.dtx Copyright (C) 1994 Sergio Gelato +%% Made available without any warranty, express or implied. +%% Modifications +%% 03/26/98 Mike Heisler +%% Conform to Eric's final version. Margins are subject to +%% The whim of the printer. +%% 10/10/97 Mike Heisler and Eric Dahl +%% Altered footnotesize and changed the Acknowledgement and +%% Biographical titles per thesis secretary guideline that +%% they must match the rest of the document, i.e. flush left +%% and capitalized rather than all caps +%% 05/21/97 Mike Heisler +%% Added a 'papers' option to handle bibliographis as sections +%% at the end of each chapter. Reduced top margin. +%% +%% $Id$ +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +%% +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesClass{cornell} +[1998/03/26 v2.0 + Cornell University thesis class] +\newif\ifphd +\DeclareOption{phd}{\phdtrue} +\DeclareOption{master}{\phdfalse} +\ExecuteOptions{phd} +\newif\ifpapers +\DeclareOption{papers}{\paperstrue} +\DeclareOption{10pt}{% + \OptionNotUsed% + \ClassWarningNoLine{cornell}{Font size 10pt not allowed; using 12pt}% +} +\DeclareOption{11pt}{% + \OptionNotUsed% + \ClassWarningNoLine{cornell}{Font size 11pt not allowed; using 12pt}% +} +\newcommand{\prelim@contents}[1]{} +\DeclareOption{tocprelim}{% + \renewcommand{\prelim@contents}[1]{\addcontentsline{toc}{section}{#1}} +} +\DeclareOption*{% + \PassOptionsToClass{\CurrentOption}{report}% +} +\ProcessOptions + +\LoadClass[12pt]{report}[1994/06/01] +\renewcommand{\defaultscriptratio}{.75} +\renewcommand{\defaultscriptscriptratio}{.6} +\setlength\headsep{25\p@} +\if@twocolumn +\else + \setlength\oddsidemargin{0in} + \setlength\evensidemargin{0in} + \setlength\textwidth{6.5in} + \setlength\topmargin{-0.5in} + \setlength\headheight{0.2in} + \setlength\headsep{0.35in} + \setlength\textheight{8.85in} + \setlength\footskip{0.5in} + \setlength\marginparwidth{0.85in} + \setlength\marginparsep{0.125in} +\fi +\if@compatibility + \setlength\topmargin{0\p@} +\else +\fi +\newcommand{\ps@cornell}{% +\def\@oddhead{{\slshape\rightmark}\hfil\thepage}% +\def\@oddfoot{}% +\def\@evenhead{\thepage\hfil{\slshape\leftmark}}% +\def\@evenfoot{}% +\def\chaptermark##1{}% +\def\sectionmark##1{}% +} +\newcommand{\ps@cornellc}{% +\def\@oddhead{\hfil\thepage\hfil}% +\def\@oddfoot{}% +\def\@evenhead{\@oddhead}% +\def\@evenfoot{}% +\def\chaptermark##1{}% +\def\sectionmark##1{}% +} +\raggedbottom +\newcommand{\@prolformat}[1]{{\begin{flushleft} \Huge #1 \end{flushleft}} } +\newcommand{\ackname}{\@prolformat{Acknowledgements}} +\newcommand{\bioname}{\@prolformat{Biographical Sketch}} +\renewcommand{\contentsname}{\@prolformat{Table of Contents}} +\renewcommand{\listtablename}{\@prolformat{List of Tables}} +\renewcommand{\listfigurename}{\@prolformat{List of Figures}} +\renewcommand{\l@figure}{\@dottedtocline{1}{1.5em}{2.6em}} +\let\l@table\l@figure + +\renewenvironment{thebibliography}[1] + {\ifpapers \clearpage \section*{\bibname% + \@mkboth{\uppercase{\bibname}}{\uppercase{\bibname}}}% + \else% + \chapter*{\bibname% + \@mkboth{\uppercase{\bibname}}{\uppercase{\bibname}}}% + \fi% + \list{\@biblabel{\arabic{enumiv}}}% + {\settowidth\labelwidth{\@biblabel{#1}}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep + \@openbib@code + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{\arabic{enumiv}}}% + \sloppy\clubpenalty4000\widowpenalty4000% + \sfcode`\.\@m\relax + \ifpapers% + \addcontentsline{toc}{section}{\bibname}% + \else% + \addcontentsline{toc}{chapter}{\bibname}% + \fi + \singlespacing} + {\def\@noitemerr + {\@latex@warning{Empty `thebibliography' environment}}% + \normalspacing + \endlist} + +\newcommand{\@titlesize}{\Large} +\newcommand{\@subtitlesize}{\large} +\newcommand{\@authorsize}{\normalsize} % No Pharaoh he. +\newcommand{\@conferralmonth}{January} +\newcommand{\@conferralyear}{} + +\newcommand{\titlesize}[1]{\renewcommand{\@titlesize}{#1}} +\newcommand{\subtitlesize}[1]{\renewcommand{\@subtitlesize}{#1}} +\newcommand{\authorsize}[1]{\renewcommand{\@authorsize}{#1}} +\newcommand{\conferraldate}[2]{% + \renewcommand{\@conferralmonth}{#1} + \renewcommand{\@conferralyear}{#2} +} +\newcommand{\@degreefield}{Master of Science} %CHANGED +\newcommand{\degreefield}[1]{\renewcommand{\@degreefield}{#1}} %CHANGED + +\renewcommand{\maketitle}{% + \begin{titlepage}% + \vspace*{-0.24in} + \begin{center}% + \@titlesize \@title + \end{center} + \vfill + %\begin{center} + %\@subtitlesize + %A \ifphd Dissertation \else Thesis \fi \\ %CHANGED + %Presented to the Faculty of the Graduate School \\ + %of Cornell University \\ + %in Partial Fulfillment of the Requirements for the Degree of \\ + %\ifphd Doctor of Philosophy \else \@degreefield \fi %CHANGED + %\end{center} + \vfill + \begin{center} + \@authorsize + by \\ + \@author \\ + \@conferralmonth\ \@conferralyear + \end{center} + \vspace*{0.26in} + \end{titlepage} +} + +\renewenvironment{titlepage}{% + \typeout{Title page} + \pagestyle{empty} + \doublespacing +}{% + \normalspacing\clearpage +} + + +\newenvironment{copyrightpage}{% + \typeout{Copyleft page} + \pagestyle{empty} + \null\vfil + \begin{center} +}{% + \end{center} + \vfil\null + \clearpage +} + +\newcommand{\makecopyright}{% + \begin{copyrightpage} + \copyright\ \@copyrightholder\ \@copyrightyear \\ + ALL RIGHTS RESERVED \\[.5in] + \end{copyrightpage} +} +\newcommand{\@copyrightholder}{\@author} +\newcommand{\@copyrightyear}{\@conferralyear} + +\newcommand{\copyrightholder}[1]{\renewcommand{\@copyrightholder}{#1}} +\newcommand{\copyrightyear}[1]{\renewcommand{\@copyrightyear}{#1}} + + +\newlength{\@abhdskip} +\renewenvironment{abstract}{% + \typeout{Abstract} + \singlespacing + \ifphd %CHANGED + \setlength{\@abhdskip}{.25in} + \addtolength{\@abhdskip}{-\topmargin} + \vspace*{\@abhdskip} + \begin{center} + \@abstracttitle \\ + \ \\ + \@author \\ + \@conferralyear + \end{center} + \vspace{.25in} + \else %CHANGED + \chapter*{% + \begin{center} + \normalsize + ABSTRACT + \end{center} + } + \par + \fi %CHANGED + \pagestyle{empty} + \thispagestyle{empty} +}{% + \clearpage +} + +\newcommand{\@abstracttitle}{\@title} +\newcommand{\abstracttitle}[1]{\renewcommand{\@abstracttitle}{#1}} + + +\newenvironment{biosketch}{% + \typeout{Vita} + \pagestyle{plain} + \pagenumbering{roman} + \setcounter{page}{3} + \prelim@contents{Biographical Sketch} + \chapter*{% +\bioname + } + \par +}{% + \clearpage +} + +\newenvironment{dedication}{% + \prelim@contents{Dedication} + \null\vfil + \begin{center} +}{ + \end{center} + \vfil\null + \clearpage +} + +\newenvironment{acknowledgements}{% + \prelim@contents{Acknowledgments} + \chapter*{% +\ackname + } + \par +}{% + \cleardoublepage +} + +\newcommand{\contentspage}{% + \singlespacing + \label{toc} + \prelim@contents{\contentsname} + \tableofcontents + \normalspacing + \clearpage +} + +\newcommand{\tablelistpage}{% + \singlespacing + \label{lot} + \prelim@contents{\listtablename} + \listoftables + \normalspacing + \clearpage +} + +\newcommand{\figurelistpage}{% + \singlespacing + \label{lof} + \prelim@contents{\listfigurename} + \listoffigures + \normalspacing + \clearpage +} +\newcommand{\abbrlist}{% + \singlespacing + \prelim@contents{List of Abbreviations} + \chapter*{List of Abbreviations} +} + +\newcommand{\symlist}{% + \singlespacing + \prelim@contents{List of Symbols} + \chapter*{List of Symbols} +} + +\newcommand{\preface}{% + \singlespacing + \prelim@contents{Preface} + \chapter*{Preface} +} + +\newcommand{\singlespacing}{% + \let\CS=\@currsize\renewcommand{\baselinestretch}{1.0}\tiny\CS} +\newcommand{\singlespacingplus}{% + \let\CS=\@currsize\renewcommand{\baselinestretch}{1.25}\tiny\CS} +\newcommand{\doublespacing}{% + \let\CS=\@currsize\renewcommand{\baselinestretch}{1.75}\tiny\CS} +\newcommand{\realdoublespacing}{% + \let\CS=\@currsize\renewcommand{\baselinestretch}{2}\tiny\CS} +\newcommand{\normalspacing}{\doublespacing} +\newcommand{\footnotespacing}{\singlespacing} +\newcommand{\changespacing}[2]{% + \renewcommand{#1}{% + \let\CS=\@currsize\renewcommand{\baselinestretch}{#2}\tiny\CS}% +} +\newcommand{\changenormalspacing}[1]{\renewcommand{\normalspacing}{#1}} +\normalspacing + +\endinput +%% +%% End of file `cornell.cls'. diff --git a/devopsAIAgentGuide.tex b/devopsAIAgentGuide.tex new file mode 100644 index 0000000..608fffe --- /dev/null +++ b/devopsAIAgentGuide.tex @@ -0,0 +1,107 @@ +\chapter{AI Agent Usage Guide} +\ChapterLabel{AIAgentGuide} +\index{AI agent} +\index{AI agent!DevOps workflow} +\index{Appendix!AI Agent Usage Guide} + +\section{How to Use This Appendix} +An AI agent that creates, reviews, or maintains an assignment shall read this +file first. It shall identify the task in the routing table, read the minimum +authoritative sources, and expand context only for a discovered dependency or +inconsistency. This guide is maintained in LaTeX so it is visible, versioned, +and reviewable with the assignment. + +\section{Governing Principles} +The authored LaTeX files, versioned automation, and approved assignment +materials are authoritative. The PDF is a review artifact and shall not be +edited directly. AI may draft, explain, analyze, check consistency, and assist +with builds. It shall not invent completion, evidence, access, costs, grades, +approvals, command output, security posture, or operational results. + +\section{Chapter File Convention} +\index{AI agent!chapter file convention} +Every assignment chapter shall be stored in exactly one file named with the +\texttt{devops} prefix, a PascalCase chapter name, and the \texttt{.tex} +suffix. For example, Chapter~2 is fully contained in +\path{devopsExampleAssignment.tex}. A chapter file shall begin with its +\texttt{\string\chapter\{...\}} command and contain all of that chapter's +sections and subsections. Do not split one chapter across files, create +section-only \texttt{.tex} files, or use \texttt{\string\input} or +\texttt{\string\include} to assemble a chapter from smaller fragments. + +Supporting non-chapter files may use a different name only when they are not +chapter content: \texttt{prologue.tex}, \texttt{abstract.tex}, +\texttt{devopsGlossary.tex}, and \texttt{devopsReferences.bib} are examples. +Appendix chapters follow the same chapter-file convention. + +\section{AI Quick Start} +\begin{enumerate} +\item Read this guide and identify the requested outcome. +\item Select the closest task below and load only its listed sources. +\item Inspect supplied facts and report consequential gaps or assumptions. +\item Make narrowly scoped changes; preserve stable IDs, glossary terms, and history. +\item Never request, print, store, or commit credentials, tokens, personal data, or production data. +\item Build the complete PDF, inspect the log, visually inspect affected pages, and record material AI use in \ChapterRef{AIPromptLog}. +\end{enumerate} + +\section{Task Routing} +\small +\begin{tabularx}{\linewidth}{L{4.0cm}Y} +\caption{AI Task-Routing Table\label{Table:AITaskRouting}}\\ +\toprule \textbf{Task} & \textbf{Minimum authoritative sources}\\ \midrule +Initialize an assignment & \texttt{devopsAssignment.tex}, \texttt{prologue.tex}, \texttt{devopsIntroduction.tex}, \texttt{devopsExampleAssignment.tex}, and the instructor's assignment facts.\\ +Develop a workflow & \texttt{devopsExampleAssignment.tex}, source repository materials, and authorized environment constraints.\\ +Define evidence & \texttt{devopsExampleAssignment.tex} and controlled execution outputs.\\ +Review a retrospective & \texttt{devopsExampleAssignment.tex} and the submitted workflow or runbook.\\ +Edit AI guidance & \texttt{devopsAIAgentGuide.tex}, \texttt{devopsAIPromptLog.tex}, \texttt{devopsDocumentGuide.tex}, and \texttt{devopsAssignment.tex}.\\ +Compile or troubleshoot & \texttt{devopsAssignment.tex}, \texttt{devopsDocumentGuide.tex}, the affected chapter, and the build log.\\ \bottomrule +\end{tabularx} +\normalsize + +\section{DevOps-Specific Rules} +\begin{enumerate} +\item Prefer versioned, repeatable automation over undocumented manual steps. +\item Treat deployment output, monitoring data, and screenshots as evidence only when they reflect an actual execution. +\item Design failure exercises to be isolated, reversible, and authorized. +\item Apply least privilege and never place secrets in LaTeX, source control, prompts, screenshots, or logs. +\item State expected cloud cost, cleanup action, and resource ownership for each remote-environment activity. +\item Identify whether a recommendation is a proposal, an instructor directive, or demonstrated evidence. +\end{enumerate} + +\section{Example AI Requests} +\subsection{Create an Assignment Brief} +\begin{verbatim} +Read devopsAIAgentGuide.tex and use the Initialize an Assignment context. +From the supplied SSW 590 objective and constraints, fill only supported +placeholders in the introduction and activity brief. Propose clear, observable +completion criteria, a safe cleanup action, and a rubric. Do not invent cloud +access, due dates, policy, costs, or approved tools. Update history, compile, +and report instructor decisions still needed. +\end{verbatim} + +\subsection{Review a Student Workflow} +\begin{verbatim} +Read devopsAIAgentGuide.tex and the workflow, evidence, and retrospective +chapters. Review the supplied repository and sanitized evidence for +reproducibility, least privilege, observability, rollback, and cleanup. +Separate verified facts from gaps and recommendations. Do not claim that an +unexecuted command passed, and do not request credentials or operate resources. +\end{verbatim} + +\section{Human Decisions and Information Boundaries} +The instructor retains authority over assignment scope, grading, due dates, +approved tooling, access, budgets, security posture, exceptions, and policy. +An AI agent shall surface alternatives and evidence, not represent a decision +as approved. Record material prompts, assumptions, corrections, and unresolved +issues in \ChapterRef{AIPromptLog}. + +\section{Completion Checklist} +\begin{itemize} +\item Scope, deliverables, environment, constraints, and cleanup are clear. +\item Activity identifiers and evidence references are valid and unique. +\item Examples contain no secrets, personal data, or unsafe production actions. +\item New controlled terms are added to the glossary and indexed. +\item The newest approved change is recorded in document history. +\item The complete build succeeds with no unresolved references or missing files. +\item A human reviews all decisions requiring instructional or operational authority. +\end{itemize} diff --git a/devopsAIPromptLog.tex b/devopsAIPromptLog.tex new file mode 100644 index 0000000..e1356de --- /dev/null +++ b/devopsAIPromptLog.tex @@ -0,0 +1,14 @@ +\chapter{AI Prompt Log} +\ChapterLabel{AIPromptLog} +\index{AI prompt log} +\section{How to Use This Appendix} +Use this log when AI assistance materially affects assignment wording, +automation, evidence interpretation, troubleshooting, or feedback. Record +enough context for an instructor or reviewer to understand the input, output, +assumptions, and human corrections. Do not record credentials or personal data. + +\section{Example Record} +Date: \textit{[timestamp]}; Tool and model: \textit{[name]}; Task: +\textit{[requested outcome]}; Inputs: \textit{[sanitized constraints and +evidence]}; Output used: \textit{[summary]}; Human review and corrections: +\textit{[summary]}; Unresolved assumptions: \textit{[list or none]}. diff --git a/devopsAssignment.tex b/devopsAssignment.tex new file mode 100644 index 0000000..dcd2ce3 --- /dev/null +++ b/devopsAssignment.tex @@ -0,0 +1,132 @@ +% SSW 590 DevOps Assignment Template +% Developed by Darian Muresan, Ph.D., with OpenAI Codex and Anthropic Claude Code. +% AI agents: read devopsAIAgentGuide.tex before editing this template. +\documentclass[12pt]{cornell} + +\usepackage[T1]{fontenc} +\usepackage{lmodern} +\usepackage{xspace} +\usepackage{xcolor} +\usepackage{graphicx} +\usepackage{fancyhdr} +\usepackage{amsmath,amssymb} +\usepackage{array} +\usepackage{booktabs} +\usepackage{longtable} +\usepackage{tabularx} +\usepackage{ltablex} +\keepXColumns +\usepackage{enumitem} +\usepackage{listings} +\usepackage{tcolorbox} +\usepackage{makeidx} +\usepackage[colorlinks=true,citecolor=blue,linkcolor=blue,urlcolor=blue]{hyperref} +\usepackage[acronym,toc]{glossaries} + +\makeindex +\makeglossaries +\input{devopsGlossary.tex} + +\definecolor{devopsBlue}{RGB}{31,78,121} +\definecolor{devopsGreen}{RGB}{46,125,50} +\definecolor{devopsRed}{RGB}{183,28,28} +\definecolor{devopsGray}{RGB}{90,90,90} +\definecolor{devopsLightBlue}{RGB}{232,240,247} + +% Replace these values for each assignment. +\newcommand{\AssignmentTitle}{Linux Commands} +\newcommand{\AssignmentNumber}{2} +\newcommand{\DocumentVersion}{1.4} +\newcommand{\DocumentStatus}{} +\newcommand{\CourseNumber}{SSW 590} +\newcommand{\CourseName}{DevOps} +\newcommand{\Instructor}{Maxwell Friedman, Alex Nemirovsky, Sofia Stoeckel, and Magdola Nagy} +\newcommand{\Organization}{Stevens Institute of Technology} +\newcommand{\DocumentDate}{September 16th, 2026} +\newcommand{\DueDate}{} +\newcommand{\VERSION}{Version \DocumentVersion} + +\hypersetup{ + pdftitle={\CourseNumber\ --- Assignment \AssignmentNumber: \AssignmentTitle}, + pdfauthor={\Instructor}, + pdfcreator={Darian Muresan, Ph.D., with OpenAI Codex and Anthropic Claude Code}, + pdfsubject={Reusable DevOps course assignment template}, + pdfkeywords={DevOps, automation, delivery pipeline, infrastructure as code, evidence} +} + +\newcolumntype{Y}{>{\raggedright\arraybackslash}X} +\newcolumntype{L}[1]{>{\raggedright\arraybackslash}p{#1}} +\setlength{\tabcolsep}{4pt} +\renewcommand{\arraystretch}{1.12} +\setlength{\LTpre}{6pt} +\setlength{\LTpost}{6pt} + +% Stable IDs make activity, evidence, and artifact references durable. +\newcommand{\ArtifactLabel}[2]{\phantomsection\label{#1:#2}} +\newcommand{\ArtifactID}[2]{\texttt{#2}\ArtifactLabel{#1}{#2}\index{#1!#2}} +\newcommand{\ArtifactRef}[2]{\hyperref[#1:#2]{\texttt{#2}}} +\newcommand{\ActivityID}[1]{\ArtifactID{Activity}{#1}} +\newcommand{\ActivityRef}[1]{\ArtifactRef{Activity}{#1}} +\newcommand{\EvidenceID}[1]{\ArtifactID{Evidence}{#1}} +\newcommand{\EvidenceRef}[1]{\ArtifactRef{Evidence}{#1}} +\newcommand{\ChapterLabel}[1]{\label{Chapter:#1}} +\newcommand{\ChapterRef}[1]{\hyperref[Chapter:#1]{Chapter~\ref*{Chapter:#1}}} +\newcommand{\StatusPass}{\textbf{\footnotesize\textcolor{devopsGreen}{PASS}}} +\newcommand{\StatusPending}{\textbf{\footnotesize\textcolor{devopsGray}{PENDING}}} +\newcommand{\StatusFail}{\textbf{\footnotesize\textcolor{devopsRed}{FAIL}}} + +\newtcolorbox{devopsNote}[1][]{ + colback=devopsLightBlue, colframe=devopsBlue, boxrule=0.6pt, arc=1mm, title=#1 +} + +\lstset{ + backgroundcolor=\color{white}, basicstyle=\ttfamily\footnotesize, + breaklines=true, frame=single, keywordstyle=\color{blue}, + commentstyle=\color{devopsGreen}, numbers=left, numbersep=6pt, + numberstyle=\tiny\color{devopsGray}, showstringspaces=false, + stringstyle=\color{devopsRed}, tabsize=2 +} + +\changenormalspacing{\singlespacing} +\begin{document} +\pagenumbering{roman} +\singlespacing +\include{prologue} +\include{devopsIntroduction} +\include{devopsExampleAssignment} +\include{linuxCommands} +\include{digitalOceanDocker} +\include{latexDocker} +\include{projectProposal} + +\setcounter{page}{1} +\pagenumbering{arabic} +\pagestyle{fancy} +\fancyhf{} +\renewcommand{\chaptermark}[1]{\markboth{#1}{}} +\lhead{\small Assignment \AssignmentNumber} +\chead{\small\nouppercase{\leftmark}} +\rhead{\small\thepage} +\lfoot{\small\CourseNumber} +\cfoot{\small\copyright\ \Organization} +\rfoot{\small\VERSION} +\renewcommand{\headrulewidth}{0.4pt} +\renewcommand{\footrulewidth}{0.4pt} + +\bibliographystyle{IEEEtran} +\bibliography{devopsReferences} + +\appendix +\include{devopsDocumentGuide} +\include{devopsAIAgentGuide} +\include{devopsAIPromptLog} + +\glsaddall +\printglossaries +\cleardoublepage +\phantomsection +\ChapterLabel{Index} +\addcontentsline{toc}{chapter}{Index} +\markboth{Index}{Index} +\printindex +\end{document} diff --git a/devopsDocumentGuide.tex b/devopsDocumentGuide.tex new file mode 100644 index 0000000..328c3be --- /dev/null +++ b/devopsDocumentGuide.tex @@ -0,0 +1,142 @@ +\chapter{Document Authoring Guide} +\ChapterLabel{DocumentGuide} +\index{LaTeX} +\index{document conventions} +\index{Appendix!Document Authoring Guide} + +\section{How to Use This Appendix} +Use this appendix to maintain the template's file conventions, build process, +and review rules. Update it when the document structure or toolchain changes. + +\section{Template Provenance} +This template was developed by \textbf{Darian Muresan, Ph.D.}, in conjunction +with \textbf{OpenAI Codex} and \textbf{Anthropic Claude Code}. Keep this +attribution distinct from the assignment-specific instructor metadata. + +\section{File Naming and Responsibilities} +Every chapter file shall use the \texttt{devops} prefix, a PascalCase chapter +name, and the \texttt{.tex} suffix. Each such file shall contain one complete +chapter, beginning with \texttt{\string\chapter\{...\}}, and all of its +sections and subsections. Do not split one chapter into section-level +\texttt{.tex} files. For example, all of Chapter~2 is contained in +\path{devopsExampleAssignment.tex}. Do not add requirements or +architecture-design chapters; this template records a DevOps learning activity +and its operational evidence. + +\section{Synonyms and Controlled Terms} +\index{synonyms} +Use one preferred term for each important concept. If an assignment uses +equivalent terms, record them here before release. For example, state whether +``continuous delivery'' refers to \gls{cd} generally or specifically excludes +automatic production deployment. Add important terms to +\texttt{devopsGlossary.tex} and index them where used. + +\section{Building the PDF} +The template requires a LaTeX distribution with \texttt{pdflatex}, +\texttt{bibtex}, \texttt{makeglossaries}, and \texttt{makeindex}. +Install the tools using the platform instructions below, then run one of the +following platform builds. + +\subsection{macOS and Linux Build} +\begin{verbatim} +make -f makefileMacLinux pdf +\end{verbatim} + +\subsection{Windows PowerShell Build} +\begin{verbatim} +.\makefilePowerShell.ps1 -Action pdf +\end{verbatim} +The completed build regenerates references, bibliography, glossary, and index. +Review the log and visually inspect affected PDF pages. Do not edit generated +auxiliary files or the PDF directly. + +\section{Install LaTeX Tools on macOS} +\index{macOS} +\index{MacTeX} +\subsection{Recommended Installation} +Install the current full \href{https://www.tug.org/mactex/}{MacTeX} +distribution. It includes TeX Live, \texttt{pdflatex}, \texttt{bibtex}, +\texttt{latexmk}, \texttt{makeglossaries}, \texttt{makeindex}, and useful +applications such as TeXShop and TeX Live Utility. The full distribution is the +least troublesome choice for this template because it includes the packages +used by the glossary, table, listing, color, and hyperlink features. + +Either download the signed installer from the MacTeX web site and complete the +macOS installation dialog, or, if Homebrew is already installed, run: +\begin{verbatim} +brew install --cask mactex +\end{verbatim} +Close and reopen Terminal after installation. If the TeX commands are not +found, add the MacTeX binary directory to the current shell session: +\begin{verbatim} +export PATH="/Library/TeX/texbin:$PATH" +\end{verbatim} +Do not place this command in a shell profile until it has been verified on the +local computer. + +\subsection{Verification and Compilation} +From the template directory, verify the tools: +\begin{verbatim} +command -v pdflatex bibtex latexmk makeglossaries makeindex +\end{verbatim} +Each command should print a path. Then create the PDF: +\begin{verbatim} +make -f makefileMacLinux pdf +\end{verbatim} +To remove generated intermediate files while keeping the PDF, run: +\begin{verbatim} +make -f makefileMacLinux clean +\end{verbatim} + +\section{Install LaTeX Tools on Windows} +\index{Windows} +\index{MiKTeX} +\subsection{Recommended Installation} +Install the current Basic MiKTeX distribution using the official +\href{https://miktex.org/howto/install-miktex}{MiKTeX Windows installation +guide}. During installation, choose a per-user installation when appropriate +and set missing-package installation to \emph{Ask me first} or \emph{Yes}. +The latter is convenient for a student machine with Internet access; the former +makes each package installation explicit. + +Open MiKTeX Console after installation, apply available updates, and install +the \texttt{latexmk} package if the verification command below cannot find it. +On an organization-managed computer, obtain approval before installing software +or changing execution policy. + +\subsection{Verification and Compilation} +Open a new PowerShell window in the template directory and verify: +\begin{verbatim} +Get-Command pdflatex,bibtex,latexmk,makeglossaries,makeindex +\end{verbatim} +Each command should display a command record. Build the PDF with: +\begin{verbatim} +.\makefilePowerShell.ps1 -Action pdf +\end{verbatim} +If PowerShell blocks the script under a managed execution policy, ask the +system administrator for the approved procedure. Do not bypass institutional +security policy. To remove intermediate build files, run: +\begin{verbatim} +.\makefilePowerShell.ps1 -Action clean +\end{verbatim} + +\section{Common Build Problems} +\begin{tabularx}{\linewidth}{L{3.0cm}Y} +\toprule \textbf{Symptom} & \textbf{Resolution}\\ \midrule +Command not found & Close and reopen the terminal. On macOS, verify the TeX +binary path; on Windows, verify MiKTeX completed installation and is on the user PATH.\\ +Missing LaTeX package & Use MiKTeX Console or its approved on-the-fly package +installation prompt on Windows. On macOS, install the full MacTeX distribution +or use TeX Live Utility to add the missing package.\\ +References or glossary incomplete & Run the supplied platform build instead of +a single \texttt{pdflatex} command; it runs BibTeX, the glossary tool, and the +index tool in the required order.\\ +Script is blocked & Follow the institution's approved PowerShell policy or run +the documented build commands with an approved administrator.\\ \bottomrule +\end{tabularx} + +\section{Authoring and Review Rules} +Replace bracketed placeholders with assignment facts. Keep operational examples +safe, bounded, and free of credentials. Link activities to evidence, retain +history, and state unknowns or instructor decisions explicitly. Rebuild after +structural, cross-reference, table, glossary, or index changes. diff --git a/devopsDocumentHistory.tex b/devopsDocumentHistory.tex new file mode 100644 index 0000000..b5073a3 --- /dev/null +++ b/devopsDocumentHistory.tex @@ -0,0 +1,22 @@ +\chapter*{Document History} +\addcontentsline{toc}{chapter}{Document History} +\index{document history} +\section*{How to Use This Chapter} +Add the newest approved change at the top. Retain every approved entry and +link each entry to the changed chapter, table, figure, or controlled artifact. + +\begin{tabularx}{\linewidth}{L{3.1cm}L{2.2cm}YL{2.0cm}} +\caption{Document Update History\label{Table:DocumentHistory}}\\ +\toprule \textbf{Date / Version} & \textbf{Author Initials} & \textbf{Change} & \textbf{Changed At}\\ \midrule +\endfirsthead +\multicolumn{4}{l}{\small\itshape Document Update History (continued)}\\ +\toprule \textbf{Date / Version} & \textbf{Author Initials} & \textbf{Change} & \textbf{Changed At}\\ \midrule +\endhead \bottomrule \endlastfoot +September 24, 2026 / 1.5 & MF, AN, SS, MN & Created the Digital Ocean Docker Deployment, LaTeX, and Project Proposal chapters. & \ChapterRef{DigitalOceanDocker}, \ChapterRef{LatexDocker}, \ChapterRef{ProjectProposal}\\ +September 16, 2026 / 1.4 & MF, AN, SS, MN & Created the Linux Commands chapter at \texttt{linuxCommands.tex}. & \ChapterRef{LinuxCommands}\\ +September 2, 2026 / 1.3 & DDM, CDX & Established the one-file-per-chapter convention, added it to the AI Agent Usage Guide, and consolidated the complete example assignment chapter into \texttt{devopsExampleAssignment.tex}. & \ChapterRef{ExampleAssignment}, \ChapterRef{AIAgentGuide}, \ChapterRef{DocumentGuide}\\ +September 2, 2026 / 1.2 & DDM, CDX & Added macOS MacTeX and Windows MiKTeX installation, verification, compilation, cleanup, and troubleshooting instructions to the Document Authoring Guide appendix. & \ChapterRef{DocumentGuide}\\ +September 2, 2026 / 1.1 & DDM, CDX & Reorganized the example assignment as one chapter with activity, workflow, evidence, retrospective, and submission sections so each homework can follow the same chapter pattern. & \ChapterRef{ExampleAssignment}\\ +September 2, 2026 / 1.0 & DDM, CDX & Created the reusable SSW 590 DevOps assignment template from the architecture template infrastructure; replaced requirements and design chapters with activity, workflow, evidence, retrospective, and submission chapters. & \ChapterRef{Introduction}, \ChapterRef{ExampleAssignment}, \ChapterRef{AIAgentGuide}\\ +\textit{[date / version]} & \textit{[initials]} & \textit{[approved change and rationale]} & \textit{[link]}\\ +\end{tabularx} diff --git a/devopsExampleAssignment.tex b/devopsExampleAssignment.tex new file mode 100644 index 0000000..1180e2f --- /dev/null +++ b/devopsExampleAssignment.tex @@ -0,0 +1,126 @@ +\chapter{Example Assignment} +\ChapterLabel{ExampleAssignment} +\index{activity brief} +\index{workflow} +\index{automation} +\index{infrastructure as code} +\index{evidence} +\index{observability} +\index{rollback} +\index{retrospective} +\index{continuous improvement} +\index{submission} +\index{cleanup} + +\section{Activity Brief} +\subsection{Scenario} +Describe the operational scenario and why it matters. Use a bounded, +non-production system. \textit{Example: A team must deploy a small service +reliably to a remote Linux host and recover from a failed release.} + +\subsection{Activities} +Assign stable IDs to each assessed activity. Add rows as needed. +\begin{tabularx}{\linewidth}{L{2.1cm}L{3.1cm}Y} +\caption{Activity Register\label{Table:ActivityRegister}}\\ +\toprule \textbf{ID} & \textbf{Activity} & \textbf{Completion criterion}\\ \midrule +\ActivityID{ACT-01} & \textit{[Prepare environment]} & \textit{[repeatable environment baseline is present]}\\ +\ActivityID{ACT-02} & \textit{[Automate workflow]} & \textit{[workflow runs from documented inputs]}\\ +\ActivityID{ACT-03} & \textit{[Observe and recover]} & \textit{[evidence shows monitoring and recovery]}\\ \bottomrule +\end{tabularx} + +\subsection{Success Criteria} +State observable outcomes, not implementation prescriptions. Include security, +cost, cleanup, and reproducibility criteria where applicable. + +\subsection{Assessment Rubric} +\begin{tabularx}{\linewidth}{L{3.2cm}L{2.0cm}Y} +\toprule \textbf{Criterion} & \textbf{Weight} & \textbf{Evidence expected}\\ \midrule +Reproducible workflow & \textit{[points]} & \textit{[automation and clean-run proof]}\\ +Operational quality & \textit{[points]} & \textit{[observability, rollback, security]}\\ +Evidence and explanation & \textit{[points]} & \textit{[commands, outputs, rationale]}\\ +Reflection & \textit{[points]} & \textit{[failure analysis and improvement]}\\ \bottomrule +\end{tabularx} + +\section{Workflow and Implementation} +\subsection{Environment Baseline} +Specify the authorized environment, prerequisites, access model, versioned +inputs, and teardown procedure. Record commands in a repository script or +infrastructure-as-code definition; do not rely on a sequence of undocumented +console clicks. + +\subsection{Procedure} +For each activity, state the goal, input, command or automation entry point, +expected result, and rollback or cleanup action. Link the corresponding +activity identifier and evidence identifier. + +\begin{lstlisting}[language=bash,caption={Replace with a safe, repeatable workflow entry point.}] +# ./scripts/provision.sh --environment sandbox +# ./scripts/deploy.sh --version +# ./scripts/destroy.sh --environment sandbox +\end{lstlisting} + +\subsection{Operational Controls} +Describe least-privilege access, secret handling, logging, monitoring, change +control, budget guardrails, backup or rollback, and resource cleanup. A secret +shall be referenced by its approved storage location, never pasted into this +document or committed to the repository. + +\subsection{Failure Exercise} +Define one safe failure or degradation scenario. State the trigger, expected +signal, diagnosis path, recovery action, and evidence required. Never direct +students to disrupt shared or production infrastructure. + +\section{Evidence Register} +\subsection{How to Use This Section} +Evidence demonstrates an actual execution; an expected result is not evidence. +Use sanitized command output, logs, screenshots, links to versioned files, or +recorded metrics. Redact secrets and personal information. + +\begin{tabularx}{\linewidth}{L{1.7cm}L{2.2cm}L{2.6cm}Y} +\caption{Evidence Register\label{Table:EvidenceRegister}}\\ +\toprule \textbf{ID} & \textbf{Activity} & \textbf{Evidence type} & \textbf{Location and interpretation}\\ \midrule +\EvidenceID{EVD-01} & \ActivityRef{ACT-01} & \textit{[log / script / image]} & \textit{[repository path or sanitized URL; what it demonstrates]}\\ +\EvidenceID{EVD-02} & \ActivityRef{ACT-02} & \textit{[pipeline output]} & \textit{[location; result and relevant timestamp]}\\ +\EvidenceID{EVD-03} & \ActivityRef{ACT-03} & \textit{[monitoring / recovery output]} & \textit{[location; failure signal and recovery result]}\\ \bottomrule +\end{tabularx} + +\subsection{Evidence Quality Checks} +Evidence should identify the executed version, environment, time, command or +automation entry point, outcome, and any deviation from the expected result. +State failures plainly; they are valuable inputs to the retrospective. + +\section{Retrospective} +\subsection{Outcome} +Summarize what happened, including completed work, gaps, and unexpected +behavior. Distinguish facts from interpretation. + +\subsection{Flow and Feedback} +Identify queues, handoffs, manual steps, slow feedback, and sources of rework. +Explain which changes improved delivery flow or made failures visible sooner. +This emphasis on flow, feedback, and continual learning is consistent with the +DevOps framing introduced in \cite{PhoenixProject}. + +\subsection{Improvement Experiments} +Propose one or more small, testable improvements. State the hypothesis, change, +measurement, expected result, and risk. Do not represent a proposal as an +approved production change. + +\subsection{Team Contributions} +For team assignments, concisely identify each member's meaningful contribution +and any collaboration constraints. + +\section{Submission and Cleanup} +\subsection{Submission Checklist} +\begin{itemize} +\item Versioned automation, configuration, and runbook are committed. +\item Evidence links resolve and contain no secrets or personal data. +\item The retrospective is complete and distinguishes results from proposals. +\item Remote resources have been destroyed or explicitly transferred as directed. +\item The repository identifies the final commit or release tag. +\end{itemize} + +\subsection{Academic Integrity and Responsible Use} +Follow the course policy for collaboration and AI assistance. Cite external +code, tutorials, and AI-generated material as required by the instructor. +Students remain responsible for understanding, testing, and explaining all +submitted work. diff --git a/devopsGlossary.tex b/devopsGlossary.tex new file mode 100644 index 0000000..186607f --- /dev/null +++ b/devopsGlossary.tex @@ -0,0 +1,13 @@ +\newacronym{ai}{AI}{artificial intelligence} +\newacronym{ci}{CI}{continuous integration} +\newacronym{cd}{CD}{continuous delivery or continuous deployment} +\newacronym{iac}{IaC}{infrastructure as code} +\newacronym{slo}{SLO}{service-level objective} +\newglossaryentry{automation}{name={automation},description={A repeatable, version-controlled procedure executed by software rather than undocumented manual steps}} +\newglossaryentry{deployment}{name={deployment},description={The controlled delivery of a versioned change to an environment}} +\newglossaryentry{evidence}{name={evidence},description={A retained record of an actual execution, observation, or review}} +\newglossaryentry{observability}{name={observability},description={The ability to infer system behavior from signals such as logs, metrics, traces, and health checks}} +\newglossaryentry{pipeline}{name={pipeline},description={An automated sequence that builds, tests, packages, and/or deploys a change}} +\newglossaryentry{rollback}{name={rollback},description={A controlled return to a known acceptable version or state after a failed or harmful change}} +\newglossaryentry{runbook}{name={runbook},description={A documented operational procedure for a repeatable task or incident response}} +\newglossaryentry{synonyms}{name={synonyms},description={Equivalent terms used in this assignment; record preferred terms to avoid ambiguity in instructions and evidence}} diff --git a/devopsIntroduction.tex b/devopsIntroduction.tex new file mode 100644 index 0000000..2d3eddd --- /dev/null +++ b/devopsIntroduction.tex @@ -0,0 +1,47 @@ +\chapter{Introduction} +\ChapterLabel{Introduction} +\index{introduction} +\index{DevOps} + +\section{How to Use This Assignment} +Replace bracketed text with approved assignment facts. Delete instructional +examples before release, but retain the stable identifiers, history, glossary, +index, appendices, and evidence structure. This document is an assignment +brief and operational record, not a requirements or software-design document. + +\section{Purpose and Learning Objectives} +State the DevOps capability students will practice and the observable learning +outcomes. \textit{Example: Students will provision a minimal Linux service, +automate its deployment, collect operational evidence, and demonstrate a safe +rollback.} + +\section{Scope and Constraints} +State the permitted cloud or local environment, team size, required tools, +budget limits, source-control repository, timebox, and prohibited actions. +Do not include credentials, access tokens, student records, or production data. + +\section{Deliverables and Due Date} +\begin{tabularx}{\linewidth}{L{3.2cm}Y} +\toprule \textbf{Item} & \textbf{Expectation}\\ \midrule +Due date & \DueDate\\ +Repository & \textit{[repository URL or LMS location]}\\ +Required deliverables & \textit{[automation, runbook, evidence, reflection]}\\ +Team policy & \textit{[individual or team; contribution expectations]}\\ \bottomrule +\end{tabularx} + +\section{Using This Template with AI Agents} +\index{AI agent!DevOps workflow} +AI may assist with explanation, drafting, troubleshooting, and reviewing +automation. It does not replace student understanding or authorize an agent to +operate accounts, approve work, invent results, or receive secrets. Before +editing, an AI agent shall read \texttt{devopsAIAgentGuide.tex}, load only the +relevant assignment files, identify assumptions, and preserve evidence +boundaries. Record material AI assistance in \ChapterRef{AIPromptLog}. + +\begin{verbatim} +Read devopsAIAgentGuide.tex first. For this SSW 590 assignment, identify the +requested task and read only the listed sources. Use supplied evidence only; +do not invent commands, deployment results, approvals, credentials, or costs. +Preserve stable IDs and history. Make the smallest appropriate change, build +the PDF, and report assumptions, risks, and actions requiring human approval. +\end{verbatim} diff --git a/devopsReferences.bib b/devopsReferences.bib new file mode 100644 index 0000000..59f00cb --- /dev/null +++ b/devopsReferences.bib @@ -0,0 +1,6 @@ +@book{PhoenixProject, + author = {Kim, Gene and Behr, Kevin and Spafford, George}, + title = {The Phoenix Project: A Novel about IT, DevOps, and Helping Your Business Win}, + publisher = {IT Revolution Press}, + year = {2018} +} diff --git a/digitalOceanDocker.tex b/digitalOceanDocker.tex new file mode 100644 index 0000000..c6b9fea --- /dev/null +++ b/digitalOceanDocker.tex @@ -0,0 +1,3 @@ +\chapter{Digital Ocean Docker Deployment} +\ChapterLabel{DigitalOceanDocker} + diff --git a/latexDocker.tex b/latexDocker.tex new file mode 100644 index 0000000..75c67f5 --- /dev/null +++ b/latexDocker.tex @@ -0,0 +1,3 @@ +\chapter{LaTeX Docker} +\ChapterLabel{LatexDocker} + diff --git a/linuxCommands.tex b/linuxCommands.tex new file mode 100644 index 0000000..8a37759 --- /dev/null +++ b/linuxCommands.tex @@ -0,0 +1,338 @@ +\chapter{Linux Commands} +\ChapterLabel{LinuxCommands} + +\begin{figure}[htbp] + \centering + \includegraphics[width=1\textwidth]{terminal.png} + \caption{Linux terminal screenshot of the bash commands ran in Step 2.} + \label{fig:linux_terminal} +\end{figure} + +\section{Navigation and File Ops} + + +1. paris@paris-Precision-3581:~/lx-test + +\begin{figure} + \centering + \includegraphics[width=1\linewidth]{linux/image0.png} + \caption{All entries in ~/lx-test.} + \label{fig:img2} +\end{figure} + +\begin{figure} + \centering + \includegraphics[width=1\linewidth]{linux/image1.png} + \caption{Copying txt to tmp.} + \label{fig:img3} +\end{figure} + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image2.png} + \caption{old.txt moved into archive/.} + \label{fig:img4} +\end{figure} + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image3.png} + \caption{New empty file notes.md created.} + \label{fig:img5} +\end{figure} + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image4.png} + \caption{Disk usage for the src directory.} + \label{fig:img6} +\end{figure} + +\newpage +\section{Viewing and Searching} + + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image6.png} + \caption{Line numbers printed in sys.log.} + \label{fig:img7} +\end{figure} + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image7.png} + \caption{sys.log lines filtered by ERROR.} + \label{fig:img8} +\end{figure} + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image8.png} + \caption{Distinctive words in words.txt counted.} + \label{fig:img9} +\end{figure} + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image9.png} + \caption{Lines starting with G in words.txt shown.} + \label{fig:img10} +\end{figure} + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image10.png} + \caption{First two lines of people.csv displayed.} + \label{fig:img11} +\end{figure} + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image11.png} + \caption{Last three lines of sys.log shown.} + \label{fig:img12} +\end{figure} + +\newpage +\section{Text Processing} + + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image12.png} + \caption{Name column of people.csv printed.} + \label{fig:img13} +\end{figure} + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image13.png} + \caption{words.txt sorted case-insensitively without duplicates.} + \label{fig:img14} +\end{figure} + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image14.png} + \label{fig:img15} +\end{figure} +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/imaging.png} + \caption{"three" replaced with 3 in src.txt with backups.} + \label{fig:placeholder} +\end{figure} + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image15.png} + \caption{Lines, words, and bytes printed for every *.txt file in src.} + \label{fig:img16} +\end{figure} + +\newpage +\section{Permissions and Ownership} + + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image16.png} + \caption{tmp/ made only read/write/searchable by the owner.} + \label{fig:img17} +\end{figure} + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image17.png} + \caption{src/lib given group execute permission recursively.} + \label{fig:img18} +\end{figure} + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image18.png} + \caption{Numeric permissions of src/file2.txt shown.} + \label{fig:img19} +\end{figure} + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image19.png} + \caption{notes.md made append-nly for the owner.} + \label{fig:img20} +\end{figure} + +\newpage +\section{Links and Find} + + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image20.png} + \caption{link-to-file1's target path.} + \label{fig:img21} +\end{figure} + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image21.png} + \caption{All regular files over 40 KiB under the current tree.} + \label{fig:img22} +\end{figure} + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image22.png} + \caption{Files modified in the last 10 minutes under tmp/.} + \label{fig:img23} +\end{figure} + +\newpage +\section{Processes and Job Control} + + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image23.png} + \label{fig:img24} +\end{figure} +\begin{figure} + \centering + \includegraphics[width=1\linewidth]{linux/imagest.png} + \label{fig:placeholder} +\end{figure} +\begin{figure} + \centering + \includegraphics[width=1\linewidth]{linux/imageringest.png} + \caption{Processes shown in tree view.} + \label{fig:placeholder} +\end{figure} + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image24.png} + \caption{sleep 120 started and its PID.} + \label{fig:img25} +\end{figure} + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image25.png} + \caption{TERM signal sent to all sleep processes.} + \label{fig:img26} +\end{figure} + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image26.png} + \caption{Top 5 processes by memory usage shown.} + \label{fig:img27} +\end{figure} + +\newpage +\section{Archiving and Compression} + + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image27.png} + \caption{src.tgz created from src/.} + \label{fig:img28} +\end{figure} + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image28.png} + \caption{Contents of src.tgz listed.} + \label{fig:img29} +\end{figure} + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image29.png} + \caption{file2.txt extracted from src.tgz into tmp/.} + \label{fig:img30} +\end{figure} + +\newpage +\section{Networking and System Info} + + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image30.png} + \caption{All listening TCP sockets with PIDs shown.} + \label{fig:img31} +\end{figure} + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image31.png} + \caption{Default route concisely printed.} + \label{fig:img32} +\end{figure} + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image32.png} + \caption{Kernel name, release, and machine architecture displayed.} + \label{fig:img33} +\end{figure} + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image33.png} + \caption{Last five successful logins shown.} + \label{fig:img34} +\end{figure} + +\newpage +\section{Package and Services (Ubuntu)} + + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image34.png} + \caption{Installed version of the coreutils package shown.} + \label{fig:img35} +\end{figure} + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image35.png} + \caption{Available packages with names containing "ripgrep".} + \label{fig:img36} +\end{figure} + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image36.png} + \caption{Status line of cron service.} + \label{fig:img37} +\end{figure} + +\newpage +\section{Bash and Scripting} + + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image37.png} + \caption{One-liner that loops over *.txt in src.} + \label{fig:img38} +\end{figure} + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image38.png} + \caption{Command that exports csv rows where dept == "CS" to cs.txt.} + \label{fig:img39} +\end{figure} + +\begin{figure}[hbt!] + \centering + \includegraphics[width=1\linewidth]{linux/image39.png} + \caption{Variable X with value 42 created, printed, and deleted.} + \label{fig:img40} +\end{figure} \ No newline at end of file diff --git a/projectProposal.tex b/projectProposal.tex new file mode 100644 index 0000000..a25330d --- /dev/null +++ b/projectProposal.tex @@ -0,0 +1,3 @@ +\chapter{Project Proposal} +\ChapterLabel{ProjectProposal} + diff --git a/prologue.tex b/prologue.tex new file mode 100644 index 0000000..a3d604e --- /dev/null +++ b/prologue.tex @@ -0,0 +1,25 @@ +\title{\CourseNumber\ --- \CourseName\\[0.5em]\large Assignment \AssignmentNumber: \AssignmentTitle\\[1.5em]\normalsize\VERSION\\\DocumentStatus} +\author{\Instructor\\\Organization} +\conferraldate{}{\DocumentDate} +\copyrightholder{\Organization} +\copyrightyear{2026} +\maketitle +\makecopyright + +\cleardoublepage +\phantomsection +\chapter*{Template Attribution} +\ChapterLabel{TemplateAttribution} +\addcontentsline{toc}{chapter}{Template Attribution} +\markboth{Template Attribution}{Template Attribution} +\index{template attribution} +\index{Muresan, Darian} +This DevOps assignment template was developed by \textbf{Darian Muresan, Ph.D.}, +in conjunction with \textbf{OpenAI Codex} and \textbf{Anthropic Claude Code}. + +\clearpage +\begin{abstract}\input{abstract.tex}\end{abstract} +\input{devopsDocumentHistory.tex} +\contentspage +\tablelistpage +\figurelistpage diff --git a/terminal.png b/terminal.png new file mode 100644 index 0000000000000000000000000000000000000000..c7aeebed9079a35d7b430aee73f48101ecae0337 GIT binary patch literal 81528 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 #?i&8}x%tzkTu{W| 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