1586 lines
64 KiB
HTML
1586 lines
64 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<title>Hartman Lab Server Manual <!-- omit in toc --></title>
|
|
<style>
|
|
/* From extension vscode.markdown-math */
|
|
@font-face{font-family:KaTeX_AMS;src:url(fonts/KaTeX_AMS-Regular.woff2) format("woff2"),url(fonts/KaTeX_AMS-Regular.woff) format("woff"),url(fonts/KaTeX_AMS-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Caligraphic;src:url(fonts/KaTeX_Caligraphic-Bold.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Bold.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Bold.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Caligraphic;src:url(fonts/KaTeX_Caligraphic-Regular.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Regular.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Fraktur;src:url(fonts/KaTeX_Fraktur-Bold.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Bold.woff) format("woff"),url(fonts/KaTeX_Fraktur-Bold.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Fraktur;src:url(fonts/KaTeX_Fraktur-Regular.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Regular.woff) format("woff"),url(fonts/KaTeX_Fraktur-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-Bold.woff2) format("woff2"),url(fonts/KaTeX_Main-Bold.woff) format("woff"),url(fonts/KaTeX_Main-Bold.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Main-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Main-BoldItalic.ttf) format("truetype");font-weight:700;font-style:italic}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-Italic.woff2) format("woff2"),url(fonts/KaTeX_Main-Italic.woff) format("woff"),url(fonts/KaTeX_Main-Italic.ttf) format("truetype");font-weight:400;font-style:italic}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-Regular.woff2) format("woff2"),url(fonts/KaTeX_Main-Regular.woff) format("woff"),url(fonts/KaTeX_Main-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Math;src:url(fonts/KaTeX_Math-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Math-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Math-BoldItalic.ttf) format("truetype");font-weight:700;font-style:italic}@font-face{font-family:KaTeX_Math;src:url(fonts/KaTeX_Math-Italic.woff2) format("woff2"),url(fonts/KaTeX_Math-Italic.woff) format("woff"),url(fonts/KaTeX_Math-Italic.ttf) format("truetype");font-weight:400;font-style:italic}@font-face{font-family:"KaTeX_SansSerif";src:url(fonts/KaTeX_SansSerif-Bold.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Bold.woff) format("woff"),url(fonts/KaTeX_SansSerif-Bold.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:"KaTeX_SansSerif";src:url(fonts/KaTeX_SansSerif-Italic.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Italic.woff) format("woff"),url(fonts/KaTeX_SansSerif-Italic.ttf) format("truetype");font-weight:400;font-style:italic}@font-face{font-family:"KaTeX_SansSerif";src:url(fonts/KaTeX_SansSerif-Regular.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Regular.woff) format("woff"),url(fonts/KaTeX_SansSerif-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Script;src:url(fonts/KaTeX_Script-Regular.woff2) format("woff2"),url(fonts/KaTeX_Script-Regular.woff) format("woff"),url(fonts/KaTeX_Script-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size1;src:url(fonts/KaTeX_Size1-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size1-Regular.woff) format("woff"),url(fonts/KaTeX_Size1-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size2;src:url(fonts/KaTeX_Size2-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size2-Regular.woff) format("woff"),url(fonts/KaTeX_Size2-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size3;src:url(fonts/KaTeX_Size3-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size3-Regular.woff) format("woff"),url(fonts/KaTeX_Size3-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size4;src:url(fonts/KaTeX_Size4-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size4-Regular.woff) format("woff"),url(fonts/KaTeX_Size4-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Typewriter;src:url(fonts/KaTeX_Typewriter-Regular.woff2) format("woff2"),url(fonts/KaTeX_Typewriter-Regular.woff) format("woff"),url(fonts/KaTeX_Typewriter-Regular.ttf) format("truetype");font-weight:400;font-style:normal}.katex{font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0;text-rendering:auto;border-color:currentColor}.katex *{-ms-high-contrast-adjust:none!important}.katex .katex-version:after{content:"0.13.0"}.katex .katex-mathml{position:absolute;clip:rect(1px,1px,1px,1px);padding:0;border:0;height:1px;width:1px;overflow:hidden}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:-webkit-min-content;width:-moz-min-content;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathnormal{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-weight:700;font-style:italic}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{display:inline-table;table-layout:fixed;border-collapse:collapse}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;vertical-align:bottom;position:relative}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;vertical-align:bottom;font-size:1px;width:2px;min-width:2px}.katex .vbox{display:inline-flex;flex-direction:column;align-items:baseline}.katex .hbox{width:100%}.katex .hbox,.katex .thinbox{display:inline-flex;flex-direction:row}.katex .thinbox{width:0;max-width:0}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{width:0;position:relative}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{display:inline-block;border:0 solid;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline{display:inline-block;width:100%;border-bottom-style:dashed}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.83333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.85714286em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.77777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.88888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.58333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.66666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.41666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.48611111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.55555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.28935185em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.34722222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.40509259em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.28929605em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.38572806em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48216008em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69431051em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.83317261em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.20096463em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.28135048em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.36173633em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.48231511em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.69453376em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.83360129em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .accent>.vlist-t,.katex .op-limits>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{display:block;position:absolute;width:100%;height:inherit;fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1}.katex svg path{stroke:none}.katex img{border-style:none;min-width:0;min-height:0;max-width:none;max-height:none}.katex .stretchy{width:100%;display:block;position:relative;overflow:hidden}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{width:100%;position:relative;overflow:hidden}.katex .halfarrow-left{position:absolute;left:0;width:50.2%;overflow:hidden}.katex .halfarrow-right{position:absolute;right:0;width:50.2%;overflow:hidden}.katex .brace-left{position:absolute;left:0;width:25.1%;overflow:hidden}.katex .brace-center{position:absolute;left:25%;width:50%;overflow:hidden}.katex .brace-right{position:absolute;right:0;width:25.1%;overflow:hidden}.katex .x-arrow-pad{padding:0 .5em}.katex .cd-arrow-pad{padding:0 .55556em 0 .27778em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{box-sizing:border-box;border:.04em solid}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex .angl{box-sizing:border-content;border-top:.049em solid;border-right:.049em solid;margin-right:.03889em}.katex .anglpad{padding:0 .03889em}.katex .eqn-num:before{counter-increment:katexEqnNo;content:"(" counter(katexEqnNo) ")"}.katex .mml-eqn-num:before{counter-increment:mmlEqnNo;content:"(" counter(mmlEqnNo) ")"}.katex .mtr-glue{width:50%}.katex .cd-vert-arrow{display:inline-block;position:relative}.katex .cd-label-left{display:inline-block;position:absolute;right:calc(50% + .3em);text-align:left}.katex .cd-label-right{display:inline-block;position:absolute;left:calc(50% + .3em);text-align:right}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{text-align:left;padding-left:2em}body{counter-reset:katexEqnNo mmlEqnNo}
|
|
|
|
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
|
|
.katex-error {
|
|
color: var(--vscode-editorError-foreground);
|
|
}
|
|
|
|
/* From extension bierner.markdown-preview-github-styles */
|
|
body {
|
|
background: white;
|
|
}
|
|
|
|
.vscode-body {
|
|
box-sizing: border-box;
|
|
min-width: 200px;
|
|
max-width: 980px;
|
|
margin: 0 auto;
|
|
padding: 40px;
|
|
border: 1px solid transparent;
|
|
}
|
|
|
|
.vscode-body blockquote {
|
|
background-color: initial;
|
|
}
|
|
|
|
.vscode-body pre {
|
|
color: initial;
|
|
background: #f7f7f7 !important;
|
|
}
|
|
|
|
.vscode-body code {
|
|
color: inherit;
|
|
}
|
|
|
|
.vscode-body pre code {
|
|
color: initial;
|
|
}
|
|
|
|
.vscode-body code > div {
|
|
background: none
|
|
}
|
|
|
|
.vscode-body table th,
|
|
.vscode-body table td {
|
|
border: 1px solid #ddd !important;
|
|
}
|
|
|
|
.vscode-body.showEditorSelection .code-active-line:before {
|
|
border-left: 3px solid rgba(0, 0, 0, 0.15);
|
|
}
|
|
|
|
.vscode-body.showEditorSelection .code-line:hover:before {
|
|
border-left: 3px solid rgba(0, 0, 0, 0.40);
|
|
}
|
|
|
|
.vscode-body.showEditorSelection .code-line .code-line:hover:before {
|
|
border-left: none;
|
|
}
|
|
|
|
.vscode-body p,
|
|
.vscode-body blockquote,
|
|
.vscode-body ul,
|
|
.vscode-body ol,
|
|
.vscode-body dl,
|
|
.vscode-body table,
|
|
.vscode-body pre {
|
|
margin-top: 16px;
|
|
margin-bottom: 16px;
|
|
}
|
|
|
|
body.vscode-body::-webkit-scrollbar {
|
|
background-color: white;
|
|
}
|
|
body.vscode-body::-webkit-scrollbar-thumb {
|
|
background-color: rgba(100, 100, 100, 0.4);
|
|
}
|
|
body.vscode-body::-webkit-scrollbar-thumb:hover {
|
|
background-color: rgba(100, 100, 100, 0.7);
|
|
}
|
|
|
|
/* Generated from 'node_modules/github-markdown-css/github-markdown.css' */
|
|
.vscode-body .octicon {
|
|
display: inline-block;
|
|
fill: currentColor;
|
|
vertical-align: text-bottom;
|
|
}
|
|
|
|
.vscode-body .anchor {
|
|
float: left;
|
|
line-height: 1;
|
|
margin-left: -20px;
|
|
padding-right: 4px;
|
|
}
|
|
|
|
.vscode-body .anchor:focus {
|
|
outline: none;
|
|
}
|
|
|
|
.vscode-body h1 .octicon-link,
|
|
.vscode-body h2 .octicon-link,
|
|
.vscode-body h3 .octicon-link,
|
|
.vscode-body h4 .octicon-link,
|
|
.vscode-body h5 .octicon-link,
|
|
.vscode-body h6 .octicon-link {
|
|
color: #1b1f23;
|
|
vertical-align: middle;
|
|
visibility: hidden;
|
|
}
|
|
|
|
.vscode-body h1:hover .anchor,
|
|
.vscode-body h2:hover .anchor,
|
|
.vscode-body h3:hover .anchor,
|
|
.vscode-body h4:hover .anchor,
|
|
.vscode-body h5:hover .anchor,
|
|
.vscode-body h6:hover .anchor {
|
|
text-decoration: none;
|
|
}
|
|
|
|
.vscode-body h1:hover .anchor .octicon-link,
|
|
.vscode-body h2:hover .anchor .octicon-link,
|
|
.vscode-body h3:hover .anchor .octicon-link,
|
|
.vscode-body h4:hover .anchor .octicon-link,
|
|
.vscode-body h5:hover .anchor .octicon-link,
|
|
.vscode-body h6:hover .anchor .octicon-link {
|
|
visibility: visible;
|
|
}
|
|
|
|
.vscode-body h1:hover .anchor .octicon-link:before,
|
|
.vscode-body h2:hover .anchor .octicon-link:before,
|
|
.vscode-body h3:hover .anchor .octicon-link:before,
|
|
.vscode-body h4:hover .anchor .octicon-link:before,
|
|
.vscode-body h5:hover .anchor .octicon-link:before,
|
|
.vscode-body h6:hover .anchor .octicon-link:before {
|
|
width: 16px;
|
|
height: 16px;
|
|
content: ' ';
|
|
display: inline-block;
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' width='16' height='16' aria-hidden='true'%3E%3Cpath fill-rule='evenodd' d='M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z'%3E%3C/path%3E%3C/svg%3E");
|
|
}.vscode-body {
|
|
-ms-text-size-adjust: 100%;
|
|
-webkit-text-size-adjust: 100%;
|
|
line-height: 1.5;
|
|
color: #24292e;
|
|
font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;
|
|
font-size: 16px;
|
|
line-height: 1.5;
|
|
word-wrap: break-word;
|
|
}
|
|
|
|
.vscode-body details {
|
|
display: block;
|
|
}
|
|
|
|
.vscode-body summary {
|
|
display: list-item;
|
|
}
|
|
|
|
.vscode-body a {
|
|
background-color: initial;
|
|
}
|
|
|
|
.vscode-body a:active,
|
|
.vscode-body a:hover {
|
|
outline-width: 0;
|
|
}
|
|
|
|
.vscode-body strong {
|
|
font-weight: inherit;
|
|
font-weight: bolder;
|
|
}
|
|
|
|
.vscode-body h1 {
|
|
font-size: 2em;
|
|
margin: .67em 0;
|
|
}
|
|
|
|
.vscode-body img {
|
|
border-style: none;
|
|
}
|
|
|
|
.vscode-body code,
|
|
.vscode-body kbd,
|
|
.vscode-body pre {
|
|
font-family: monospace,monospace;
|
|
font-size: 1em;
|
|
}
|
|
|
|
.vscode-body hr {
|
|
box-sizing: initial;
|
|
height: 0;
|
|
overflow: visible;
|
|
}
|
|
|
|
.vscode-body input {
|
|
font: inherit;
|
|
margin: 0;
|
|
}
|
|
|
|
.vscode-body input {
|
|
overflow: visible;
|
|
}
|
|
|
|
.vscode-body [type=checkbox] {
|
|
box-sizing: border-box;
|
|
padding: 0;
|
|
}
|
|
|
|
.vscode-body * {
|
|
box-sizing: border-box;
|
|
}
|
|
|
|
.vscode-body input {
|
|
font-family: inherit;
|
|
font-size: inherit;
|
|
line-height: inherit;
|
|
}
|
|
|
|
.vscode-body a {
|
|
color: #0366d6;
|
|
text-decoration: none;
|
|
}
|
|
|
|
.vscode-body a:hover {
|
|
text-decoration: underline;
|
|
}
|
|
|
|
.vscode-body strong {
|
|
font-weight: 600;
|
|
}
|
|
|
|
.vscode-body hr {
|
|
height: 0;
|
|
margin: 15px 0;
|
|
overflow: hidden;
|
|
background: transparent;
|
|
border: 0;
|
|
border-bottom: 1px solid #dfe2e5;
|
|
}
|
|
|
|
.vscode-body hr:after,
|
|
.vscode-body hr:before {
|
|
display: table;
|
|
content: "";
|
|
}
|
|
|
|
.vscode-body hr:after {
|
|
clear: both;
|
|
}
|
|
|
|
.vscode-body table {
|
|
border-spacing: 0;
|
|
border-collapse: collapse;
|
|
}
|
|
|
|
.vscode-body td,
|
|
.vscode-body th {
|
|
padding: 0;
|
|
}
|
|
|
|
.vscode-body details summary {
|
|
cursor: pointer;
|
|
}
|
|
|
|
.vscode-body kbd {
|
|
display: inline-block;
|
|
padding: 3px 5px;
|
|
font: 11px SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;
|
|
line-height: 10px;
|
|
color: #444d56;
|
|
vertical-align: middle;
|
|
background-color: #fafbfc;
|
|
border: 1px solid #d1d5da;
|
|
border-radius: 3px;
|
|
box-shadow: inset 0 -1px 0 #d1d5da;
|
|
}
|
|
|
|
.vscode-body h1,
|
|
.vscode-body h2,
|
|
.vscode-body h3,
|
|
.vscode-body h4,
|
|
.vscode-body h5,
|
|
.vscode-body h6 {
|
|
margin-top: 0;
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.vscode-body h1 {
|
|
font-size: 32px;
|
|
}
|
|
|
|
.vscode-body h1,
|
|
.vscode-body h2 {
|
|
font-weight: 600;
|
|
}
|
|
|
|
.vscode-body h2 {
|
|
font-size: 24px;
|
|
}
|
|
|
|
.vscode-body h3 {
|
|
font-size: 20px;
|
|
}
|
|
|
|
.vscode-body h3,
|
|
.vscode-body h4 {
|
|
font-weight: 600;
|
|
}
|
|
|
|
.vscode-body h4 {
|
|
font-size: 16px;
|
|
}
|
|
|
|
.vscode-body h5 {
|
|
font-size: 14px;
|
|
}
|
|
|
|
.vscode-body h5,
|
|
.vscode-body h6 {
|
|
font-weight: 600;
|
|
}
|
|
|
|
.vscode-body h6 {
|
|
font-size: 12px;
|
|
}
|
|
|
|
.vscode-body p {
|
|
margin-top: 0;
|
|
margin-bottom: 10px;
|
|
}
|
|
|
|
.vscode-body blockquote {
|
|
margin: 0;
|
|
}
|
|
|
|
.vscode-body ol,
|
|
.vscode-body ul {
|
|
padding-left: 0;
|
|
margin-top: 0;
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.vscode-body ol ol,
|
|
.vscode-body ul ol {
|
|
list-style-type: lower-roman;
|
|
}
|
|
|
|
.vscode-body ol ol ol,
|
|
.vscode-body ol ul ol,
|
|
.vscode-body ul ol ol,
|
|
.vscode-body ul ul ol {
|
|
list-style-type: lower-alpha;
|
|
}
|
|
|
|
.vscode-body dd {
|
|
margin-left: 0;
|
|
}
|
|
|
|
.vscode-body code,
|
|
.vscode-body pre {
|
|
font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;
|
|
font-size: 12px;
|
|
}
|
|
|
|
.vscode-body pre {
|
|
margin-top: 0;
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.vscode-body input::-webkit-inner-spin-button,
|
|
.vscode-body input::-webkit-outer-spin-button {
|
|
margin: 0;
|
|
-webkit-appearance: none;
|
|
appearance: none;
|
|
}
|
|
|
|
.vscode-body :checked+.radio-label {
|
|
position: relative;
|
|
z-index: 1;
|
|
border-color: #0366d6;
|
|
}
|
|
|
|
.vscode-body .border {
|
|
border: 1px solid #e1e4e8!important;
|
|
}
|
|
|
|
.vscode-body .border-0 {
|
|
border: 0!important;
|
|
}
|
|
|
|
.vscode-body .border-bottom {
|
|
border-bottom: 1px solid #e1e4e8!important;
|
|
}
|
|
|
|
.vscode-body .rounded-1 {
|
|
border-radius: 3px!important;
|
|
}
|
|
|
|
.vscode-body .bg-white {
|
|
background-color: #fff!important;
|
|
}
|
|
|
|
.vscode-body .bg-gray-light {
|
|
background-color: #fafbfc!important;
|
|
}
|
|
|
|
.vscode-body .text-gray-light {
|
|
color: #6a737d!important;
|
|
}
|
|
|
|
.vscode-body .mb-0 {
|
|
margin-bottom: 0!important;
|
|
}
|
|
|
|
.vscode-body .my-2 {
|
|
margin-top: 8px!important;
|
|
margin-bottom: 8px!important;
|
|
}
|
|
|
|
.vscode-body .pl-0 {
|
|
padding-left: 0!important;
|
|
}
|
|
|
|
.vscode-body .py-0 {
|
|
padding-top: 0!important;
|
|
padding-bottom: 0!important;
|
|
}
|
|
|
|
.vscode-body .pl-1 {
|
|
padding-left: 4px!important;
|
|
}
|
|
|
|
.vscode-body .pl-2 {
|
|
padding-left: 8px!important;
|
|
}
|
|
|
|
.vscode-body .py-2 {
|
|
padding-top: 8px!important;
|
|
padding-bottom: 8px!important;
|
|
}
|
|
|
|
.vscode-body .pl-3,
|
|
.vscode-body .px-3 {
|
|
padding-left: 16px!important;
|
|
}
|
|
|
|
.vscode-body .px-3 {
|
|
padding-right: 16px!important;
|
|
}
|
|
|
|
.vscode-body .pl-4 {
|
|
padding-left: 24px!important;
|
|
}
|
|
|
|
.vscode-body .pl-5 {
|
|
padding-left: 32px!important;
|
|
}
|
|
|
|
.vscode-body .pl-6 {
|
|
padding-left: 40px!important;
|
|
}
|
|
|
|
.vscode-body .f6 {
|
|
font-size: 12px!important;
|
|
}
|
|
|
|
.vscode-body .lh-condensed {
|
|
line-height: 1.25!important;
|
|
}
|
|
|
|
.vscode-body .text-bold {
|
|
font-weight: 600!important;
|
|
}
|
|
|
|
.vscode-body .pl-c {
|
|
color: #6a737d;
|
|
}
|
|
|
|
.vscode-body .pl-c1,
|
|
.vscode-body .pl-s .pl-v {
|
|
color: #005cc5;
|
|
}
|
|
|
|
.vscode-body .pl-e,
|
|
.vscode-body .pl-en {
|
|
color: #6f42c1;
|
|
}
|
|
|
|
.vscode-body .pl-s .pl-s1,
|
|
.vscode-body .pl-smi {
|
|
color: #24292e;
|
|
}
|
|
|
|
.vscode-body .pl-ent {
|
|
color: #22863a;
|
|
}
|
|
|
|
.vscode-body .pl-k {
|
|
color: #d73a49;
|
|
}
|
|
|
|
.vscode-body .pl-pds,
|
|
.vscode-body .pl-s,
|
|
.vscode-body .pl-s .pl-pse .pl-s1,
|
|
.vscode-body .pl-sr,
|
|
.vscode-body .pl-sr .pl-cce,
|
|
.vscode-body .pl-sr .pl-sra,
|
|
.vscode-body .pl-sr .pl-sre {
|
|
color: #032f62;
|
|
}
|
|
|
|
.vscode-body .pl-smw,
|
|
.vscode-body .pl-v {
|
|
color: #e36209;
|
|
}
|
|
|
|
.vscode-body .pl-bu {
|
|
color: #b31d28;
|
|
}
|
|
|
|
.vscode-body .pl-ii {
|
|
color: #fafbfc;
|
|
background-color: #b31d28;
|
|
}
|
|
|
|
.vscode-body .pl-c2 {
|
|
color: #fafbfc;
|
|
background-color: #d73a49;
|
|
}
|
|
|
|
.vscode-body .pl-c2:before {
|
|
content: "^M";
|
|
}
|
|
|
|
.vscode-body .pl-sr .pl-cce {
|
|
font-weight: 700;
|
|
color: #22863a;
|
|
}
|
|
|
|
.vscode-body .pl-ml {
|
|
color: #735c0f;
|
|
}
|
|
|
|
.vscode-body .pl-mh,
|
|
.vscode-body .pl-mh .pl-en,
|
|
.vscode-body .pl-ms {
|
|
font-weight: 700;
|
|
color: #005cc5;
|
|
}
|
|
|
|
.vscode-body .pl-mi {
|
|
font-style: italic;
|
|
color: #24292e;
|
|
}
|
|
|
|
.vscode-body .pl-mb {
|
|
font-weight: 700;
|
|
color: #24292e;
|
|
}
|
|
|
|
.vscode-body .pl-md {
|
|
color: #b31d28;
|
|
background-color: #ffeef0;
|
|
}
|
|
|
|
.vscode-body .pl-mi1 {
|
|
color: #22863a;
|
|
background-color: #f0fff4;
|
|
}
|
|
|
|
.vscode-body .pl-mc {
|
|
color: #e36209;
|
|
background-color: #ffebda;
|
|
}
|
|
|
|
.vscode-body .pl-mi2 {
|
|
color: #f6f8fa;
|
|
background-color: #005cc5;
|
|
}
|
|
|
|
.vscode-body .pl-mdr {
|
|
font-weight: 700;
|
|
color: #6f42c1;
|
|
}
|
|
|
|
.vscode-body .pl-ba {
|
|
color: #586069;
|
|
}
|
|
|
|
.vscode-body .pl-sg {
|
|
color: #959da5;
|
|
}
|
|
|
|
.vscode-body .pl-corl {
|
|
text-decoration: underline;
|
|
color: #032f62;
|
|
}
|
|
|
|
.vscode-body .mb-0 {
|
|
margin-bottom: 0!important;
|
|
}
|
|
|
|
.vscode-body .my-2 {
|
|
margin-bottom: 8px!important;
|
|
}
|
|
|
|
.vscode-body .my-2 {
|
|
margin-top: 8px!important;
|
|
}
|
|
|
|
.vscode-body .pl-0 {
|
|
padding-left: 0!important;
|
|
}
|
|
|
|
.vscode-body .py-0 {
|
|
padding-top: 0!important;
|
|
padding-bottom: 0!important;
|
|
}
|
|
|
|
.vscode-body .pl-1 {
|
|
padding-left: 4px!important;
|
|
}
|
|
|
|
.vscode-body .pl-2 {
|
|
padding-left: 8px!important;
|
|
}
|
|
|
|
.vscode-body .py-2 {
|
|
padding-top: 8px!important;
|
|
padding-bottom: 8px!important;
|
|
}
|
|
|
|
.vscode-body .pl-3 {
|
|
padding-left: 16px!important;
|
|
}
|
|
|
|
.vscode-body .pl-4 {
|
|
padding-left: 24px!important;
|
|
}
|
|
|
|
.vscode-body .pl-5 {
|
|
padding-left: 32px!important;
|
|
}
|
|
|
|
.vscode-body .pl-6 {
|
|
padding-left: 40px!important;
|
|
}
|
|
|
|
.vscode-body .pl-7 {
|
|
padding-left: 48px!important;
|
|
}
|
|
|
|
.vscode-body .pl-8 {
|
|
padding-left: 64px!important;
|
|
}
|
|
|
|
.vscode-body .pl-9 {
|
|
padding-left: 80px!important;
|
|
}
|
|
|
|
.vscode-body .pl-10 {
|
|
padding-left: 96px!important;
|
|
}
|
|
|
|
.vscode-body .pl-11 {
|
|
padding-left: 112px!important;
|
|
}
|
|
|
|
.vscode-body .pl-12 {
|
|
padding-left: 128px!important;
|
|
}
|
|
|
|
.vscode-body hr {
|
|
border-bottom-color: #eee;
|
|
}
|
|
|
|
.vscode-body kbd {
|
|
display: inline-block;
|
|
padding: 3px 5px;
|
|
font: 11px SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;
|
|
line-height: 10px;
|
|
color: #444d56;
|
|
vertical-align: middle;
|
|
background-color: #fafbfc;
|
|
border: 1px solid #d1d5da;
|
|
border-radius: 3px;
|
|
box-shadow: inset 0 -1px 0 #d1d5da;
|
|
}
|
|
|
|
.vscode-body:after,
|
|
.vscode-body:before {
|
|
display: table;
|
|
content: "";
|
|
}
|
|
|
|
.vscode-body:after {
|
|
clear: both;
|
|
}
|
|
|
|
.vscode-body>:first-child {
|
|
margin-top: 0!important;
|
|
}
|
|
|
|
.vscode-body>:last-child {
|
|
margin-bottom: 0!important;
|
|
}
|
|
|
|
.vscode-body a:not([href]) {
|
|
color: inherit;
|
|
text-decoration: none;
|
|
}
|
|
|
|
.vscode-body blockquote,
|
|
.vscode-body details,
|
|
.vscode-body dl,
|
|
.vscode-body ol,
|
|
.vscode-body p,
|
|
.vscode-body pre,
|
|
.vscode-body table,
|
|
.vscode-body ul {
|
|
margin-top: 0;
|
|
margin-bottom: 16px;
|
|
}
|
|
|
|
.vscode-body hr {
|
|
height: .25em;
|
|
padding: 0;
|
|
margin: 24px 0;
|
|
background-color: #e1e4e8;
|
|
border: 0;
|
|
}
|
|
|
|
.vscode-body blockquote {
|
|
padding: 0 1em;
|
|
color: #6a737d;
|
|
border-left: .25em solid #dfe2e5;
|
|
}
|
|
|
|
.vscode-body blockquote>:first-child {
|
|
margin-top: 0;
|
|
}
|
|
|
|
.vscode-body blockquote>:last-child {
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.vscode-body h1,
|
|
.vscode-body h2,
|
|
.vscode-body h3,
|
|
.vscode-body h4,
|
|
.vscode-body h5,
|
|
.vscode-body h6 {
|
|
margin-top: 24px;
|
|
margin-bottom: 16px;
|
|
font-weight: 600;
|
|
line-height: 1.25;
|
|
}
|
|
|
|
.vscode-body h1 {
|
|
font-size: 2em;
|
|
}
|
|
|
|
.vscode-body h1,
|
|
.vscode-body h2 {
|
|
padding-bottom: .3em;
|
|
border-bottom: 1px solid #eaecef;
|
|
}
|
|
|
|
.vscode-body h2 {
|
|
font-size: 1.5em;
|
|
}
|
|
|
|
.vscode-body h3 {
|
|
font-size: 1.25em;
|
|
}
|
|
|
|
.vscode-body h4 {
|
|
font-size: 1em;
|
|
}
|
|
|
|
.vscode-body h5 {
|
|
font-size: .875em;
|
|
}
|
|
|
|
.vscode-body h6 {
|
|
font-size: .85em;
|
|
color: #6a737d;
|
|
}
|
|
|
|
.vscode-body ol,
|
|
.vscode-body ul {
|
|
padding-left: 2em;
|
|
}
|
|
|
|
.vscode-body ol ol,
|
|
.vscode-body ol ul,
|
|
.vscode-body ul ol,
|
|
.vscode-body ul ul {
|
|
margin-top: 0;
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.vscode-body li {
|
|
word-wrap: break-all;
|
|
}
|
|
|
|
.vscode-body li>p {
|
|
margin-top: 16px;
|
|
}
|
|
|
|
.vscode-body li+li {
|
|
margin-top: .25em;
|
|
}
|
|
|
|
.vscode-body dl {
|
|
padding: 0;
|
|
}
|
|
|
|
.vscode-body dl dt {
|
|
padding: 0;
|
|
margin-top: 16px;
|
|
font-size: 1em;
|
|
font-style: italic;
|
|
font-weight: 600;
|
|
}
|
|
|
|
.vscode-body dl dd {
|
|
padding: 0 16px;
|
|
margin-bottom: 16px;
|
|
}
|
|
|
|
.vscode-body table {
|
|
display: block;
|
|
width: 100%;
|
|
overflow: auto;
|
|
}
|
|
|
|
.vscode-body table th {
|
|
font-weight: 600;
|
|
}
|
|
|
|
.vscode-body table td,
|
|
.vscode-body table th {
|
|
padding: 6px 13px;
|
|
border: 1px solid #dfe2e5;
|
|
}
|
|
|
|
.vscode-body table tr {
|
|
background-color: #fff;
|
|
border-top: 1px solid #c6cbd1;
|
|
}
|
|
|
|
.vscode-body table tr:nth-child(2n) {
|
|
background-color: #f6f8fa;
|
|
}
|
|
|
|
.vscode-body img {
|
|
max-width: 100%;
|
|
box-sizing: initial;
|
|
background-color: #fff;
|
|
}
|
|
|
|
.vscode-body img[align=right] {
|
|
padding-left: 20px;
|
|
}
|
|
|
|
.vscode-body img[align=left] {
|
|
padding-right: 20px;
|
|
}
|
|
|
|
.vscode-body code {
|
|
padding: .2em .4em;
|
|
margin: 0;
|
|
font-size: 85%;
|
|
background-color: rgba(27,31,35,.05);
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.vscode-body pre {
|
|
word-wrap: normal;
|
|
}
|
|
|
|
.vscode-body pre>code {
|
|
padding: 0;
|
|
margin: 0;
|
|
font-size: 100%;
|
|
word-break: normal;
|
|
white-space: pre;
|
|
background: transparent;
|
|
border: 0;
|
|
}
|
|
|
|
.vscode-body .highlight {
|
|
margin-bottom: 16px;
|
|
}
|
|
|
|
.vscode-body .highlight pre {
|
|
margin-bottom: 0;
|
|
word-break: normal;
|
|
}
|
|
|
|
.vscode-body .highlight pre,
|
|
.vscode-body pre {
|
|
padding: 16px;
|
|
overflow: auto;
|
|
font-size: 85%;
|
|
line-height: 1.45;
|
|
background-color: #f6f8fa;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.vscode-body pre code {
|
|
display: inline;
|
|
max-width: auto;
|
|
padding: 0;
|
|
margin: 0;
|
|
overflow: visible;
|
|
line-height: inherit;
|
|
word-wrap: normal;
|
|
background-color: initial;
|
|
border: 0;
|
|
}
|
|
|
|
.vscode-body .commit-tease-sha {
|
|
display: inline-block;
|
|
font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;
|
|
font-size: 90%;
|
|
color: #444d56;
|
|
}
|
|
|
|
.vscode-body .full-commit .btn-outline:not(:disabled):hover {
|
|
color: #005cc5;
|
|
border-color: #005cc5;
|
|
}
|
|
|
|
.vscode-body .blob-wrapper {
|
|
overflow-x: auto;
|
|
overflow-y: hidden;
|
|
}
|
|
|
|
.vscode-body .blob-wrapper-embedded {
|
|
max-height: 240px;
|
|
overflow-y: auto;
|
|
}
|
|
|
|
.vscode-body .blob-num {
|
|
width: 1%;
|
|
min-width: 50px;
|
|
padding-right: 10px;
|
|
padding-left: 10px;
|
|
font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;
|
|
font-size: 12px;
|
|
line-height: 20px;
|
|
color: rgba(27,31,35,.3);
|
|
text-align: right;
|
|
white-space: nowrap;
|
|
vertical-align: top;
|
|
cursor: pointer;
|
|
-webkit-user-select: none;
|
|
-moz-user-select: none;
|
|
-ms-user-select: none;
|
|
user-select: none;
|
|
}
|
|
|
|
.vscode-body .blob-num:hover {
|
|
color: rgba(27,31,35,.6);
|
|
}
|
|
|
|
.vscode-body .blob-num:before {
|
|
content: attr(data-line-number);
|
|
}
|
|
|
|
.vscode-body .blob-code {
|
|
position: relative;
|
|
padding-right: 10px;
|
|
padding-left: 10px;
|
|
line-height: 20px;
|
|
vertical-align: top;
|
|
}
|
|
|
|
.vscode-body .blob-code-inner {
|
|
overflow: visible;
|
|
font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;
|
|
font-size: 12px;
|
|
color: #24292e;
|
|
word-wrap: normal;
|
|
white-space: pre;
|
|
}
|
|
|
|
.vscode-body .pl-token.active,
|
|
.vscode-body .pl-token:hover {
|
|
cursor: pointer;
|
|
background: #ffea7f;
|
|
}
|
|
|
|
.vscode-body .tab-size[data-tab-size="1"] {
|
|
-moz-tab-size: 1;
|
|
tab-size: 1;
|
|
}
|
|
|
|
.vscode-body .tab-size[data-tab-size="2"] {
|
|
-moz-tab-size: 2;
|
|
tab-size: 2;
|
|
}
|
|
|
|
.vscode-body .tab-size[data-tab-size="3"] {
|
|
-moz-tab-size: 3;
|
|
tab-size: 3;
|
|
}
|
|
|
|
.vscode-body .tab-size[data-tab-size="4"] {
|
|
-moz-tab-size: 4;
|
|
tab-size: 4;
|
|
}
|
|
|
|
.vscode-body .tab-size[data-tab-size="5"] {
|
|
-moz-tab-size: 5;
|
|
tab-size: 5;
|
|
}
|
|
|
|
.vscode-body .tab-size[data-tab-size="6"] {
|
|
-moz-tab-size: 6;
|
|
tab-size: 6;
|
|
}
|
|
|
|
.vscode-body .tab-size[data-tab-size="7"] {
|
|
-moz-tab-size: 7;
|
|
tab-size: 7;
|
|
}
|
|
|
|
.vscode-body .tab-size[data-tab-size="8"] {
|
|
-moz-tab-size: 8;
|
|
tab-size: 8;
|
|
}
|
|
|
|
.vscode-body .tab-size[data-tab-size="9"] {
|
|
-moz-tab-size: 9;
|
|
tab-size: 9;
|
|
}
|
|
|
|
.vscode-body .tab-size[data-tab-size="10"] {
|
|
-moz-tab-size: 10;
|
|
tab-size: 10;
|
|
}
|
|
|
|
.vscode-body .tab-size[data-tab-size="11"] {
|
|
-moz-tab-size: 11;
|
|
tab-size: 11;
|
|
}
|
|
|
|
.vscode-body .tab-size[data-tab-size="12"] {
|
|
-moz-tab-size: 12;
|
|
tab-size: 12;
|
|
}
|
|
|
|
.vscode-body .task-list-item {
|
|
list-style-type: none;
|
|
}
|
|
|
|
.vscode-body .task-list-item+.task-list-item {
|
|
margin-top: 3px;
|
|
}
|
|
|
|
.vscode-body .task-list-item input {
|
|
margin: 0 .2em .25em -1.6em;
|
|
vertical-align: middle;
|
|
}
|
|
|
|
/*
|
|
|
|
github.com style (c) Vasily Polovnyov <vast@whiteants.net>
|
|
|
|
*/
|
|
|
|
.hljs {
|
|
display: block;
|
|
overflow-x: auto;
|
|
padding: 0.5em;
|
|
color: #333;
|
|
background: #f8f8f8;
|
|
}
|
|
|
|
.hljs-comment,
|
|
.hljs-quote {
|
|
color: #998;
|
|
font-style: italic;
|
|
}
|
|
|
|
.hljs-keyword,
|
|
.hljs-selector-tag,
|
|
.hljs-subst {
|
|
color: #333;
|
|
font-weight: bold;
|
|
}
|
|
|
|
.hljs-number,
|
|
.hljs-literal,
|
|
.hljs-variable,
|
|
.hljs-template-variable,
|
|
.hljs-tag .hljs-attr {
|
|
color: #008080;
|
|
}
|
|
|
|
.hljs-string,
|
|
.hljs-doctag {
|
|
color: #d14;
|
|
}
|
|
|
|
.hljs-title,
|
|
.hljs-section,
|
|
.hljs-selector-id {
|
|
color: #900;
|
|
font-weight: bold;
|
|
}
|
|
|
|
.hljs-subst {
|
|
font-weight: normal;
|
|
}
|
|
|
|
.hljs-type,
|
|
.hljs-class .hljs-title {
|
|
color: #458;
|
|
font-weight: bold;
|
|
}
|
|
|
|
.hljs-tag,
|
|
.hljs-name,
|
|
.hljs-attribute {
|
|
color: #000080;
|
|
font-weight: normal;
|
|
}
|
|
|
|
.hljs-regexp,
|
|
.hljs-link {
|
|
color: #009926;
|
|
}
|
|
|
|
.hljs-symbol,
|
|
.hljs-bullet {
|
|
color: #990073;
|
|
}
|
|
|
|
.hljs-built_in,
|
|
.hljs-builtin-name {
|
|
color: #0086b3;
|
|
}
|
|
|
|
.hljs-meta {
|
|
color: #999;
|
|
font-weight: bold;
|
|
}
|
|
|
|
.hljs-deletion {
|
|
background: #fdd;
|
|
}
|
|
|
|
.hljs-addition {
|
|
background: #dfd;
|
|
}
|
|
|
|
.hljs-emphasis {
|
|
font-style: italic;
|
|
}
|
|
|
|
.hljs-strong {
|
|
font-weight: bold;
|
|
}
|
|
|
|
</style>
|
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.10.2/dist/katex.min.css" integrity="sha384-yFRtMMDnQtDRO8rLpMIKrtPCD5jdktao2TV19YiZYWMDkUR5GQZR/NOVTdquEx1j" crossorigin="anonymous">
|
|
<link href="https://cdn.jsdelivr.net/npm/katex-copytex@latest/dist/katex-copytex.min.css" rel="stylesheet" type="text/css">
|
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/Microsoft/vscode/extensions/markdown-language-features/media/markdown.css">
|
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/Microsoft/vscode/extensions/markdown-language-features/media/highlight.css">
|
|
<style>
|
|
body {
|
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, 'Ubuntu', 'Droid Sans', sans-serif;
|
|
font-size: 14px;
|
|
line-height: 1.6;
|
|
}
|
|
</style>
|
|
<style>
|
|
.task-list-item { list-style-type: none; } .task-list-item-checkbox { margin-left: -20px; vertical-align: middle; }
|
|
</style>
|
|
|
|
<script src="https://cdn.jsdelivr.net/npm/katex-copytex@latest/dist/katex-copytex.min.js"></script>
|
|
|
|
</head>
|
|
<body class="vscode-body">
|
|
<h1 id="hartman-lab-server-manual-">Hartman Lab Server Manual <!-- omit in toc --></h1>
|
|
<p>© 2021 Bryan C. Roessler</p>
|
|
<p>Last updated: 2021-10-22</p>
|
|
<h2 id="table-of-contents-">Table of Contents <!-- omit in toc --></h2>
|
|
<ul>
|
|
<li><a href="#important-information">Important information</a></li>
|
|
<li><a href="#for-users">For users</a>
|
|
<ul>
|
|
<li><a href="#first-time-login">First time login</a></li>
|
|
<li><a href="#file-server">File server</a>
|
|
<ul>
|
|
<li><a href="#sshsftp">SSH/SFTP</a></li>
|
|
<li><a href="#samba-file-shares">Samba file shares</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#x2go-remote-desktop">X2Go remote desktop</a>
|
|
<ul>
|
|
<li><a href="#session-tab">Session tab</a></li>
|
|
<li><a href="#connection-tab">Connection tab</a></li>
|
|
<li><a href="#inputoutput-tab">Input/output tab</a></li>
|
|
<li><a href="#media-tab">Media tab</a></li>
|
|
<li><a href="#shared-folders">Shared folders</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#native-x-forwarding">Native X forwarding</a>
|
|
<ul>
|
|
<li><a href="#linux-osx">Linux, OSX</a></li>
|
|
<li><a href="#windows">Windows</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#windows-10-virtual-machines">Windows 10 Virtual Machines</a></li>
|
|
<li><a href="#robot-computer-access">Robot computer access</a></li>
|
|
<li><a href="#webcam-robot-monitoring">Webcam robot monitoring</a></li>
|
|
<li><a href="#rstudio-server">RStudio Server</a></li>
|
|
<li><a href="#recommendations">Recommendations</a>
|
|
<ul>
|
|
<li><a href="#backing-up-data">Backing up data</a></li>
|
|
<li><a href="#passwordless-public-private-key-authentication">Passwordless (public-private key) authentication</a></li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#for-administrators">For administrators</a>
|
|
<ul>
|
|
<li><a href="#adding-a-user">Adding a user</a></li>
|
|
<li><a href="#resetting-a-user-password">Resetting a user password</a></li>
|
|
<li><a href="#removing-a-user">Removing a user</a></li>
|
|
<li><a href="#reset-a-buggy-or-corrupt-x2go-user-session">Reset a buggy or corrupt X2Go user session</a></li>
|
|
<li><a href="#unban-a-user">Unban a user</a></li>
|
|
<li><a href="#fix-or-repair-user-file-permissions">Fix or repair user file permissions</a></li>
|
|
<li><a href="#services">Services</a></li>
|
|
<li><a href="#virtual-machines">Virtual Machines</a>
|
|
<ul>
|
|
<li><a href="#allow-access-to-the-samba-share-within-the-windows-vm-windows-bug-workaround">Allow access to the samba share within the Windows VM (Windows bug workaround)</a></li>
|
|
<li><a href="#make-an-existing-windows-10-account-user-an-administrator">Make an existing Windows 10 account user an administrator</a></li>
|
|
<li><a href="#creating-more-vm-disk-space">Creating more VM disk space</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#updating-all-software">Updating all software</a></li>
|
|
<li><a href="#scheduling-a-restart">Scheduling a restart</a></li>
|
|
<li><a href="#adding-a-drive">Adding a drive</a></li>
|
|
<li><a href="#logging">Logging</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#resources">Resources</a></li>
|
|
<li><a href="#contact">Contact</a></li>
|
|
</ul>
|
|
<h2 id="important-information">Important information</h2>
|
|
<p>If UAB restricts direct <code>ssh</code> access to the Hartman Lab Server, users will need to first connect to the UAB VPN using the <a href="https://www.uab.edu/vpn/">UAB AnyConnect VPN</a>. Once the VPN connection is established, follow the rest of the manual to connect to the server.</p>
|
|
<p>For users that do not have UAB VPN credentials, a whitelist exception for the user's IP address will need to be added to the UAB firewall. Requests to UAB IT can be made <a href="https://uabprod.service-now.com/service_portal?id=sc_cat_item&sys_id=daf70746374ce3c0daa253b543990e7f">here</a> using your UAB credentials, and should resemble the following:</p>
|
|
<pre><code class="language-(text)"><code><div>Type: Permit
|
|
Application Name: ssh
|
|
Firewall: UAB Internet Border
|
|
Source IP Addresses: User address(es)
|
|
Destination IP address: 138.26.17.151
|
|
TCP Port: 22
|
|
UDP Port: N/A
|
|
Other Protocols: N/A
|
|
Reason: Outside collaboration/(Other reason)
|
|
</div></code></code></pre>
|
|
<ul>
|
|
<li>Network Manager UAB VPN settings
|
|
<img src="manual-images/anyconnect.png" alt="UAB AnyConnect VPN"></li>
|
|
</ul>
|
|
<h2 id="for-users">For users</h2>
|
|
<h3 id="first-time-login">First time login</h3>
|
|
<ol>
|
|
<li>Ensure admin has enabled your user account.</li>
|
|
<li>Login via ssh client (ssh or <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html">PuTTY</a>): <code>ssh username@hartmanlab.genetics.uab.edu</code></li>
|
|
<li>Default password is identical to the <code>username</code></li>
|
|
<li>System will prompt you to create a new password</li>
|
|
<li>System will log user out after successful password generation</li>
|
|
<li>Re-login: <code>ssh blazerid@hartmanlab.genetics.uab.edu</code> using the new password</li>
|
|
<li><em>Optional:</em> Change Samba password (default password is your username): <code>smbpasswd</code></li>
|
|
</ol>
|
|
<h3 id="file-server">File server</h3>
|
|
<h4 id="sshsftp">SSH/SFTP</h4>
|
|
<p>Files can be transferred to/from the server using <code>sftp</code>.</p>
|
|
<p>Users can access the server directly through a terminal (text-based) ssh client (<code>ssh</code> in OSX/Linux, or <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html"><code>PuTTY</code></a> in Windows) or via a GUI SFTP program such as <a href="https://filezilla-project.org/download.php?type=client">Filezilla</a> or <a href="https://winscp.net/eng/index.php">WinSCP</a>. Linux users can access and mount the SFTP share directly within most file managers or by using <a href="https://www.digitalocean.com/community/tutorials/how-to-use-sshfs-to-mount-remote-file-systems-over-ssh"><code>sshfs</code></a>.</p>
|
|
<ul>
|
|
<li>
|
|
<p>Using <code>caja</code> to access sftp shares:
|
|
<img src="manual-images/sftp-native-linux.png" alt="Caja SFTP Example"></p>
|
|
</li>
|
|
<li>
|
|
<p>Using <a href="https://filezilla-project.org/download.php?type=client">Filezilla</a> to access sftp shares:
|
|
<img src="manual-images/filezilla.png" alt="Filezilla SFTP Example"></p>
|
|
</li>
|
|
</ul>
|
|
<h4 id="samba-file-shares">Samba file shares</h4>
|
|
<p>Samba file shares can be mounted cross-platform as if the data existed locally. The server provides two shares:</p>
|
|
<ol>
|
|
<li>The shared data array (<code>/mnt/data</code>): <code>\\username\data</code></li>
|
|
<li>The user's home directory (<code>$HOME</code>): <code>\\username\username</code></li>
|
|
</ol>
|
|
<p>The default Samba credentials are the same as your server username and password. Users can change their Samba password using <code>smbpasswd</code>.</p>
|
|
<ul>
|
|
<li>Mounting samba shares on Windows:
|
|
<ol>
|
|
<li><img src="manual-images/samba-windows1.png" alt="Samba shares on Windows"></li>
|
|
<li><img src="manual-images/samba-windows2.png" alt="Samba shares on Windows"></li>
|
|
</ol>
|
|
</li>
|
|
</ul>
|
|
<h3 id="x2go-remote-desktop">X2Go remote desktop</h3>
|
|
<p>X2Go provides a remote virtual desktop over <code>vnc</code> secured with <code>ssh</code>. X2Go clients are provided for Windows, OSX, and Linux systems on the <a href="http://wiki.x2go.org/doku.php">X2Go website</a> or from your package manager (<code>x2goclient</code>).</p>
|
|
<p>X2Go sessions can be paused or closed from the X2Go client window. Multiple sessions can be saved in the client, making it easy to select alternate quality settings based on location/bandwidth or to provide multiple user login sessions on the same machine.</p>
|
|
<p><strong>Note:</strong> Some programs do not continue to run at full speed when an X2Go session is paused. In these cases, the program should be run via remote SSH (ideally in a <a href="https://en.wikipedia.org/wiki/Tmux"><code>tmux</code></a> or <a href="https://www.gnu.org/software/screen/"><code>screen</code></a> session).</p>
|
|
<h4 id="session-tab">Session tab</h4>
|
|
<ul>
|
|
<li>Session name: Hartman Lab Server</li>
|
|
<li>Host: <a href="http://hartmanlab.genetics.uab.edu">hartmanlab.genetics.uab.edu</a></li>
|
|
<li>Login: <em>username</em></li>
|
|
<li>SSH port: 22</li>
|
|
<li>Session type: <strong>MATE</strong> (Not all session types are allowed and MATE should provide the best experience with X2Go)</li>
|
|
</ul>
|
|
<p><img src="manual-images/x2go-session.png" alt="X2Go session preferences"></p>
|
|
<h4 id="connection-tab">Connection tab</h4>
|
|
<ul>
|
|
<li>Set the connection speed to <em>LAN</em> when connecting from within the UAB network. When connecting from off-campus these quality values can be adjusted based on bandwidth and latency.</li>
|
|
<li>Compression settings should be left unchanged or set to <em>adaptive</em>.</li>
|
|
</ul>
|
|
<h4 id="inputoutput-tab">Input/output tab</h4>
|
|
<ul>
|
|
<li>If automatic window resizing is not working properly (common on HiDPI monitors), set the desired startup window resolution size manually. For fullscreen sessions, this should match your client display.</li>
|
|
<li>If there are any issues with keyboard mapping (ex. the arrow keys are not working), select <em>Configure Keyboard</em> and leave the default selected settings.</li>
|
|
</ul>
|
|
<h4 id="media-tab">Media tab</h4>
|
|
<p>Disable sound support. This will prevent <code>pulseaudio</code> from spamming the server logs.</p>
|
|
<h4 id="shared-folders">Shared folders</h4>
|
|
<ul>
|
|
<li>Select folders on the client to be shared with the server during a session. Browse to the chosen folder, add it to the share, and select <em>automount</em>.</li>
|
|
<li>These folders will then appear on the server under <code>/media/disk/<share_name></code>.
|
|
<img src="manual-images/x2go-sharedfolders.png" alt="X2Go shared folders"></li>
|
|
</ul>
|
|
<h3 id="native-x-forwarding">Native X forwarding</h3>
|
|
<p>It is possible to launch graphical server programs directly on a client.</p>
|
|
<h4 id="linux-osx">Linux, OSX</h4>
|
|
<ul>
|
|
<li><code>ssh -X username@hartmanlab.genetics.uab.edu</code></li>
|
|
<li><code>matlab</code> (to launch Matlab GUI on the client)</li>
|
|
</ul>
|
|
<h4 id="windows">Windows</h4>
|
|
<ul>
|
|
<li>Install <a href="http://www.straightrunning.com/XmingNotes/"><code>Xming</code></a> and enable X11 forwarding in the <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html"><code>PuTTY</code></a> options.</li>
|
|
</ul>
|
|
<h3 id="windows-10-virtual-machines">Windows 10 Virtual Machines</h3>
|
|
<ul>
|
|
<li>
|
|
<p>Access from within X2Go: <em>Applications>Internet>Remote Viewer</em>: <a href="spice://localhost:5900"><code>spice://localhost:5900</code></a></p>
|
|
<p><img src="manual-images/virt-viewer.png" alt="Samba shares on Windows"></p>
|
|
</li>
|
|
<li>
|
|
<p>Direct external access:
|
|
<a href="/usr/local/bin/virt-viewer"><code>virt-viewer</code></a> is available across all platforms (<a href="https://virt-manager.org/download/">Windows</a>, <a href="https://www.spice-space.org/page/OSX_Client">OSX</a>).</p>
|
|
</li>
|
|
<li>
|
|
<p>The SPICE password is: <strong><code>hartmanlab</code></strong></p>
|
|
</li>
|
|
</ul>
|
|
<p>The virtualized Windows 10 instances require logging in with your UAB email address and password.</p>
|
|
<ul>
|
|
<li><strong>Note:</strong> Users should NOT log in with a pin when prompted, it will disable access to the Samba file shares (Windows bug). Users should always log in with a password.</li>
|
|
</ul>
|
|
<p>Once you are finished using the Windows virtual machine, remember to <strong>log out of your UAB Windows account</strong> so that other users do not have access to your session. Windows will perform an automatic logoff after 30 minutes of inactivity for security.</p>
|
|
<h3 id="robot-computer-access">Robot computer access</h3>
|
|
<ul>
|
|
<li>While logged into the server, launch <em>Applications>Internet>Remote Viewer>Connection>New</em>: <code>vnc://192.168.16.101:5900</code></li>
|
|
</ul>
|
|
<h3 id="webcam-robot-monitoring">Webcam robot monitoring</h3>
|
|
<p>The robot webcam is viewable in a web page within an X2Go session at: <code>localhost:8888</code></p>
|
|
<h3 id="rstudio-server">RStudio Server</h3>
|
|
<p>Newer versions of RStudio do not support IDE access via X2Go. The IDE can be accessed via web browser at <a href="http://localhost:8787"><code>http://localhost:8787</code></a> in an X2Go session or via an SSH tunnel, ex. <code>ssh -f username@hartmanlab.genetics.uab.edu -L 8787:localhost:8787 -N</code></p>
|
|
<h3 id="recommendations">Recommendations</h3>
|
|
<h4 id="backing-up-data">Backing up data</h4>
|
|
<p>The <a href="https://linux.die.net/man/1/rsync"><code>rsync</code></a>, <code>rsnapshot</code>, and <a href="https://syncthing.net/"><code>syncthing</code></a> tools are installed on the server to facilitate user backups.</p>
|
|
<p><a href="https://linux.die.net/man/1/rsync"><code>rsync</code></a> is recommended for users that would just like to periodically backup their <code>$HOME</code> directory to a local machine over ssh:
|
|
<code>rsync -azH --delete username@hartmanlab.genetics.uab.edu:~/* ~/backup/</code></p>
|
|
<p>A GUI alternative, <a href="https://syncthing.net/"><code>syncthing</code></a> (<em>Applications>Internet>Syncthing</em>) syncs folders and files between machines automatically and is accessible at <a href="http://localhost:8384"><code>http://localhost:8384</code></a></p>
|
|
<h4 id="passwordless-public-private-key-authentication">Passwordless (public-private key) authentication</h4>
|
|
<p>Public-private key authentication is more secure than passwords and can be configured for <em>passwordless</em> login.</p>
|
|
<ul>
|
|
<li>Generate the key-pair and add it to the server:
|
|
<ul>
|
|
<li>To enable public-private key authentication, the user will need to generate a public and private keys on the client machine using <code>ssh-keygen</code> (Linux & OSX) or <code>PuTTYgen</code> (Windows). The user can then transfer the public key to the server using <code>ssh-copy-id</code>.</li>
|
|
</ul>
|
|
</li>
|
|
<li>Configure the X2Go client for passwordless login:
|
|
<ul>
|
|
<li>Linux
|
|
<ul>
|
|
<li>Check the <em>Try autologin</em> box in the session settings.</li>
|
|
</ul>
|
|
</li>
|
|
<li>OSX/Windows
|
|
<ul>
|
|
<li>Select <em>Use RSA/DSA key for ssh connection</em> in the session settings and select the location of the public key manually.</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<p>Most popular SFTP programs support using public-private keys for passwordless authentication. Windows/OSX users may need to add their key pair to PuTTy/Filezilla/WinSCP manually.</p>
|
|
<p>Once configured, the user will no longer need to enter their password to access the SFTP or X2Go server, which simplifies login and enhances security.</p>
|
|
<h2 id="for-administrators">For administrators</h2>
|
|
<ul>
|
|
<li>Type <code>scripts-</code> and use <code>tab</code> completion in the CLI to access the following customized helper programs.</li>
|
|
<li>Run them with administrator privileges using <code>sudo</code>.</li>
|
|
</ul>
|
|
<h3 id="adding-a-user">Adding a user</h3>
|
|
<ul>
|
|
<li><code>script-user-add</code> <code>username</code> <em><code>password</code></em>
|
|
<ul>
|
|
<li>Optionally pass a second argument <em><code>password</code></em> to create a user's password for them. If omitted, the default password is equal to the <em><code>username</code></em>.</li>
|
|
<li><code>username</code> can be anything, but ideally a unique string of small capital letters.</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<h3 id="resetting-a-user-password">Resetting a user password</h3>
|
|
<ul>
|
|
<li><code>script-user-reset-password</code> <code>username</code> <em><code>password</code></em>
|
|
<ul>
|
|
<li>If a user forgets their password this will reset it to <em><code>password</code></em>, or if <em><code>password</code></em> is omitted, to the <code>username</code>. In either case the user will be prompted to enter a new password at next login. The Samba password cannot be changed by users, only admins.</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<h3 id="removing-a-user">Removing a user</h3>
|
|
<ul>
|
|
<li><code>script-user-remove</code> <em><code>username</code></em>
|
|
<ul>
|
|
<li>This will allow you to optionally backup user files to the array before user deletion.</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<h3 id="reset-a-buggy-or-corrupt-x2go-user-session">Reset a buggy or corrupt X2Go user session</h3>
|
|
<ul>
|
|
<li><code>script-user-reset-x2go</code> <code>username</code>
|
|
<ul>
|
|
<li>Completely reset the X2Go state for the user <code>username</code>. This will destroy any active or paused X2Go sessions for that users.</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<h3 id="unban-a-user">Unban a user</h3>
|
|
<ul>
|
|
<li><code>script-user-unban</code> <code>IP Address</code>
|
|
<ul>
|
|
<li>Fail2ban is configured to whitelist the UAB subnet, however repeated failed authentication attempts from off-campus clients will result in a compounding “cool down” period starting at 10 minutes where repeated login attempts from an IP address will be blocked. In cases of emergency, this can be reset manually if the user provides their WAN IP address.</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<h3 id="fix-or-repair-user-file-permissions">Fix or repair user file permissions</h3>
|
|
<ul>
|
|
<li><code>script-files-permissions-set</code> <em><code>username</code></em> <em><code>password</code></em> <em><code>PATH[...]</code></em>
|
|
<ul>
|
|
<li>This script will walk you through fixing or setting the permissions on one or more <code>PATH</code>'s. If no PATH is provided the <code>$PWD</code> is used.</li>
|
|
</ul>
|
|
</li>
|
|
<li><code>script-files-permissions-reset</code> <em><code>PATH[...]</code></em>
|
|
<ul>
|
|
<li>If no <em><code>PATH[...]</code></em> is provided it will reset the data array <code>/mnt/data</code>.</li>
|
|
<li>If things go really south, use this script as a method of last resort to reset permissions on a path by resetting the original permissions for the shared data.</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<h3 id="services">Services</h3>
|
|
<ul>
|
|
<li>Start: <code>sudo systemctl start smb.service</code></li>
|
|
<li>Stop: <code>sudo systemctl stop smb.service</code></li>
|
|
<li>Enable at boot: <code>sudo systemctl enable smb.service</code></li>
|
|
<li>Disable at boot: <code>sudo systemctl disable smb.service</code></li>
|
|
<li>Restart service: <code>sudo systemctl restart smb.service</code></li>
|
|
<li>Reload services: <code>sudo systemctl daemon-reload</code></li>
|
|
<li>Read service: <code>sudo systemctl cat smb.service</code></li>
|
|
</ul>
|
|
<h3 id="virtual-machines">Virtual Machines</h3>
|
|
<ul>
|
|
<li>
|
|
<p>Use <code>virt-manager</code> to create a new virtual machine</p>
|
|
<ul>
|
|
<li>Optionally copy an existing Windows <code>.qcow2</code> image so that Windows and the virtio drivers do not need to be reinstalled.</li>
|
|
<li>In case a new VM is required, the Windows virtualization drivers (<a href="https://fedoraproject.org/wiki/Windows_Virtio_Drivers"><code>virtio</code></a>) are located at <code>/usr/share/virtio-win</code>.</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
<p>Activate Windows using the UAB license in elevated Powershell:</p>
|
|
<pre><code class="language-(powershell)"><code><div>slmgr -skms itis-msls.ad.uab.edu
|
|
slmgr -ato
|
|
</div></code></code></pre>
|
|
</li>
|
|
<li>
|
|
<p>Add the UAB DNS server(s) (138.26.5.2, 138.26.5.66) to the Windows network config access UAB resources</p>
|
|
</li>
|
|
</ul>
|
|
<h4 id="allow-access-to-the-samba-share-within-the-windows-vm-windows-bug-workaround">Allow access to the samba share within the Windows VM (Windows bug workaround)</h4>
|
|
<ol>
|
|
<li>Open <code>C:\Windows\system32\drivers\etc\hosts</code> file and copy contents.</li>
|
|
<li>Open new text document, paste contents of existing hosts file and add appropriate blazerid and server IP line (see existing entries).</li>
|
|
<li>Save as “hosts” (no extension).</li>
|
|
<li>Copy new hosts file to <code>C:\Windows\system32\drivers\etc\</code> (allow it to overwrite existing hosts file).</li>
|
|
<li>The new user will be able to map/access their samba shares at <code>\\blazerid\data</code> and <code>\\blazerid\blazerid</code>.</li>
|
|
</ol>
|
|
<h4 id="make-an-existing-windows-10-account-user-an-administrator">Make an existing Windows 10 account user an administrator</h4>
|
|
<ol>
|
|
<li>Login to the PC as the Azure AD user you want to make a local admin.</li>
|
|
<li>Log out as that user and login as a local admin.</li>
|
|
<li>In elevated Powershell, add the user to the administrators group: <code>net localgroup administrators AzureAD\\blazerid@uab.edu /add</code></li>
|
|
</ol>
|
|
<h4 id="creating-more-vm-disk-space">Creating more VM disk space</h4>
|
|
<ul>
|
|
<li>Add 20 GBs of space to the Windows VM: <code>sudo qemu-img resize /var/lib/libvirt/images/win10-5900.qcow2 +20G</code></li>
|
|
<li>Add <a href="/media/share/documentation">gparted iso</a> as boot device and expand working partition.</li>
|
|
</ul>
|
|
<h3 id="updating-all-software">Updating all software</h3>
|
|
<ul>
|
|
<li><code>script-system-update</code>
|
|
<ul>
|
|
<li>The server regularly installs security updates unattended</li>
|
|
<li>If the kernel, java, systemd, or other major components are updated, the system should be restarted.</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<h3 id="scheduling-a-restart">Scheduling a restart</h3>
|
|
<ul>
|
|
<li><code>script-system-scheduled-restart</code> <em><code>OnCalendar</code></em>
|
|
<ul>
|
|
<li>If a valid <code>OnCalendar</code> is not passed, assumes <code>*-*-* 01:30:00</code> (1:30 AM).</li>
|
|
<li>See <a href="https://www.freedesktop.org/software/systemd/man/systemd.time.html">Calendar Events</a> for time formatting.</li>
|
|
<li>This will alert users via <code>notify-send</code> in X2Go, <code>wall</code> in ssh, and add a reminder to the <code>motd</code> about the scheduled restart.</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<h3 id="adding-a-drive">Adding a drive</h3>
|
|
<ul>
|
|
<li><s><code>scripts-drive-add</code> <code>/dev/sdX</code></s> (Under construction)
|
|
<ul>
|
|
<li>To determine the correct drive, use <code>lsblk -f</code>.</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<h3 id="logging">Logging</h3>
|
|
<ul>
|
|
<li>First point of reference for server problems: <code>sudo journalctl</code>
|
|
<ul>
|
|
<li>Follow new output: <code>sudo journalctl -f</code></li>
|
|
<li>Reverse logs: <code>sudo journalctl -r</code></li>
|
|
</ul>
|
|
</li>
|
|
<li>Logging in via <code>ssh</code> will provide some useful server information in the <a href="https://en.wikipedia.org/wiki/Motd_(Unix)"><code>motd</code></a>.</li>
|
|
</ul>
|
|
<h2 id="resources">Resources</h2>
|
|
<ul>
|
|
<li><a href="https://access.redhat.com/documentation/en/red-hat-enterprise-linux/">RHEL documentation</a></li>
|
|
<li>CLI
|
|
<ul>
|
|
<li><a href="https://www.digitalocean.com/community/tutorials/basic-linux-navigation-and-file-management">Navigating the Linux CLI</a></li>
|
|
<li><a href="https://explainshell.com/">Explainshell</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="https://docs.uabgrid.uab.edu/wiki/Cheaha_GettingStarted">UAB Cheaha</a></li>
|
|
</ul>
|
|
<h2 id="contact">Contact</h2>
|
|
<ul>
|
|
<li><a href="mailto:jwrodger@uab.edu">John Rodgers</a></li>
|
|
<li><a href="mailto:bryanroessler@gmail.com">Bryan Roessler</a></li>
|
|
</ul>
|
|
|
|
</body>
|
|
</html> |