main
Rob Muhlestein 2 years ago
commit 2ea0289e9f

@ -0,0 +1 @@
/Users/rmuhlest/repos/github.com/rwxrob/dot/.FreeCAD

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<FCParameters>
<FCParamGroup Name="Root">
<FCParamGroup Name="Modules">
<FCParamGroup Name="Path">
<FCText Name="HelpIndex">Path/Help/index.html</FCText>
<FCText Name="WorkBenchName">Path</FCText>
<FCText Name="WorkBenchModule">PathWorkbench.py</FCText>
</FCParamGroup>
<FCParamGroup Name="Spreadsheet">
<FCText Name="HelpIndex">Spreadsheet/Help/index.html</FCText>
<FCText Name="WorkBenchName">Spreadsheet</FCText>
<FCText Name="WorkBenchModule">SpreadsheetWorkbench.py</FCText>
</FCParamGroup>
<FCParamGroup Name="Image">
<FCText Name="HelpIndex">Image/Help/index.html</FCText>
<FCText Name="WorkBenchName">Image</FCText>
<FCText Name="WorkBenchModule">ImageWorkbench.py</FCText>
</FCParamGroup>
</FCParamGroup>
</FCParamGroup>
</FCParameters>

@ -0,0 +1,472 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<FCParameters>
<FCParamGroup Name="Root">
<FCParamGroup Name="BaseApp">
<FCParamGroup Name="LogLevels">
<FCInt Name="Default" Value="2"/>
</FCParamGroup>
<FCParamGroup Name="Preferences">
<FCParamGroup Name="General">
<FCText Name="FileOpenSavePath">/home/rwxrob/Downloads</FCText>
<FCText Name="AutoloadModule">PartDesignWorkbench</FCText>
<FCBool Name="ShowSplasher" Value="1"/>
<FCBool Name="PythonWordWrap" Value="1"/>
<FCInt Name="ToolbarIconSize" Value="24"/>
<FCText Name="LastModule">PartWorkbench</FCText></FCParamGroup>
<FCParamGroup Name="Units">
<FCInt Name="UserSchema" Value="0"/>
<FCInt Name="Decimals" Value="2"/>
<FCInt Name="FracInch" Value="8"/>
</FCParamGroup>
<FCParamGroup Name="Macro">
<FCBool Name="LocalEnvironment" Value="1"/>
<FCText Name="MacroPath">/home/rwxrob/.FreeCAD/Macro</FCText>
<FCBool Name="RecordGui" Value="1"/>
<FCBool Name="GuiAsComment" Value="1"/>
<FCBool Name="ScriptToPyConsole" Value="1"/>
<FCBool Name="ScriptToFile" Value="0"/>
<FCText Name="ScriptFile">FullScript.FCScript</FCText>
</FCParamGroup>
<FCParamGroup Name="Mod">
<FCParamGroup Name="OpenSCAD"/>
<FCParamGroup Name="Import">
<FCParamGroup Name="hSTEP">
<FCBool Name="ReadShapeCompoundMode" Value="1"/>
</FCParamGroup>
<FCBool Name="ExportHiddenObject" Value="0"/>
<FCBool Name="ExportLegacy" Value="0"/>
<FCBool Name="ExportKeepPlacement" Value="0"/>
<FCBool Name="ImportHiddenObject" Value="0"/>
<FCBool Name="UseLinkGroup" Value="0"/>
<FCBool Name="UseBaseName" Value="0"/>
<FCBool Name="ReduceObjects" Value="0"/>
<FCBool Name="ExpandCompound" Value="0"/>
<FCBool Name="ShowProgress" Value="0"/>
<FCInt Name="ImportMode" Value="0"/>
</FCParamGroup>
<FCParamGroup Name="Start">
<FCText Name="AutoloadModule">StartWorkbench</FCText>
<FCUInt Name="BackgroundColor1" Value="1331197183"/>
<FCUInt Name="BackgroundTextColor" Value="4294703103"/>
<FCUInt Name="PageColor" Value="4294967295"/>
<FCUInt Name="PageTextColor" Value="255"/>
<FCUInt Name="BoxColor" Value="3722305023"/>
<FCUInt Name="LinkColor" Value="65535"/>
<FCUInt Name="BackgroundColor2" Value="2141107711"/>
<FCText Name="Template"/>
<FCText Name="BackgroundImage"/>
<FCText Name="ShowCustomFolder"/>
<FCBool Name="InWeb" Value="0"/>
<FCBool Name="InBrowser" Value="1"/>
<FCBool Name="ShowNotes" Value="0"/>
<FCBool Name="ShowExamples" Value="1"/>
<FCBool Name="closeStart" Value="0"/>
<FCBool Name="DoNotShowOnOpen" Value="0"/>
<FCBool Name="ShowForum" Value="0"/>
<FCBool Name="UseStyleSheet" Value="0"/>
<FCBool Name="NewFileGradient" Value="0"/>
<FCBool Name="ShowTips" Value="1"/>
<FCText Name="FontFamily"/>
<FCInt Name="FontSize" Value="13"/>
</FCParamGroup>
<FCParamGroup Name="Arch">
<FCInt Name="ifcMulticore" Value="0"/>
<FCText Name="ifcRootElement">IfcProduct</FCText>
<FCText Name="ifcSkip"/>
<FCInt Name="ifcImportModeArch" Value="0"/>
<FCInt Name="ifcImportModeStruct" Value="0"/>
<FCBool Name="ifcShowDialog" Value="0"/>
<FCBool Name="ifcDebug" Value="0"/>
<FCBool Name="ifcCreateClones" Value="1"/>
<FCBool Name="ifcSeparateOpenings" Value="0"/>
<FCBool Name="ifcGetExtrusions" Value="0"/>
<FCBool Name="ifcSplitLayers" Value="0"/>
<FCBool Name="ifcPrefixNumbers" Value="0"/>
<FCBool Name="ifcMergeMaterials" Value="0"/>
<FCBool Name="ifcImportProperties" Value="0"/>
<FCBool Name="ifcAllowInvalid" Value="0"/>
<FCBool Name="ifcFitViewOnImport" Value="0"/>
<FCBool Name="IfcImportFreeCADProperties" Value="0"/>
<FCBool Name="ifcReplaceProject" Value="0"/>
<FCInt Name="ifcExportModel" Value="0"/>
<FCInt Name="ifcUnit" Value="0"/>
<FCBool Name="ifcExportAsBrep" Value="0"/>
<FCBool Name="ifcUseDaeOptions" Value="0"/>
<FCBool Name="ifcJoinCoplanarFacets" Value="0"/>
<FCBool Name="ifcStoreUid" Value="1"/>
<FCBool Name="ifcSerialize" Value="0"/>
<FCBool Name="ifcExport2D" Value="1"/>
<FCBool Name="IfcExportFreeCADProperties" Value="0"/>
<FCBool Name="ifcCompress" Value="1"/>
<FCBool Name="DisableIfcRectangleProfileDef" Value="0"/>
<FCBool Name="getStandardCase" Value="0"/>
<FCBool Name="IfcAddDefaultSite" Value="0"/>
<FCBool Name="IfcAddDefaultBuilding" Value="1"/>
<FCBool Name="IfcAddDefaultStorey" Value="0"/>
<FCInt Name="ColladaSegsPerEdge" Value="1"/>
<FCInt Name="ColladaSegsPerRadius" Value="2"/>
<FCFloat Name="ColladaScalingFactor" Value="1.000000000000"/>
<FCFloat Name="ColladaTessellation" Value="1.000000000000"/>
<FCFloat Name="ColladaGrading" Value="0.300000000000"/>
<FCInt Name="ColladaMesher" Value="0"/>
<FCBool Name="ColladaSecondOrder" Value="0"/>
<FCBool Name="ColladaOptimize" Value="1"/>
<FCBool Name="ColladaAllowQuads" Value="0"/>
</FCParamGroup>
<FCParamGroup Name="Draft">
<FCFloat Name="dxfScaling" Value="1.000000000000"/>
<FCFloat Name="maxsegmentlength" Value="5.000000000000"/>
<FCBool Name="dxfShowDialog" Value="0"/>
<FCBool Name="dxfUseLegacyImporter" Value="0"/>
<FCBool Name="dxfUseLegacyExporter" Value="0"/>
<FCBool Name="dxfAllowDownload" Value="0"/>
<FCBool Name="dxftext" Value="0"/>
<FCBool Name="dxfImportPoints" Value="0"/>
<FCBool Name="dxflayout" Value="0"/>
<FCBool Name="dxfstarblocks" Value="0"/>
<FCBool Name="dxfGetOriginalColors" Value="0"/>
<FCBool Name="joingeometry" Value="0"/>
<FCBool Name="groupLayers" Value="0"/>
<FCBool Name="dxfStdSize" Value="0"/>
<FCBool Name="dxfUseDraftVisGroups" Value="1"/>
<FCBool Name="importDxfHatches" Value="0"/>
<FCBool Name="renderPolylineWidth" Value="0"/>
<FCBool Name="DiscretizeEllipses" Value="1"/>
<FCBool Name="dxfmesh" Value="0"/>
<FCBool Name="dxfExportBlocks" Value="1"/>
<FCBool Name="dxfproject" Value="0"/>
<FCBool Name="dxfCreatePart" Value="1"/>
<FCBool Name="dxfCreateDraft" Value="0"/>
<FCBool Name="dxfCreateSketch" Value="0"/>
<FCText Name="TeighaFileConverter"/>
<FCFloat Name="svgDiscretization" Value="0.000000000000"/>
<FCInt Name="svgstyle" Value="0"/>
<FCInt Name="svg_export_style" Value="0"/>
<FCBool Name="svgDisableUnitScaling" Value="0"/>
<FCBool Name="SvgLinesBlack" Value="1"/>
<FCBool Name="ocaareas" Value="0"/>
</FCParamGroup>
<FCParamGroup Name="Part">
<FCParamGroup Name="General">
<FCInt Name="WriteSurfaceCurveMode" Value="1"/>
</FCParamGroup>
<FCParamGroup Name="IGES">
<FCInt Name="Unit" Value="0"/>
<FCBool Name="BrepMode" Value="0"/>
<FCBool Name="SkipBlankEntities" Value="1"/>
<FCText Name="Company"/>
<FCText Name="Author"/>
</FCParamGroup>
<FCParamGroup Name="STEP">
<FCInt Name="Unit" Value="0"/>
<FCText Name="Scheme">AP214IS</FCText>
<FCText Name="Company"/>
<FCText Name="Author"/>
</FCParamGroup>
<FCParamGroup Name="Boolean">
<FCBool Name="CheckModel" Value="1"/>
<FCBool Name="RefineModel" Value="1"/>
</FCParamGroup>
<FCBool Name="AddBaseObjectName" Value="0"/>
<FCFloat Name="MeshDeviation" Value="0.500000000000"/>
<FCFloat Name="MeshAngularDeflection" Value="6.000000000000"/>
<FCBool Name="TwoSideRendering" Value="1"/>
<FCInt Name="GridLinePattern" Value="3855"/>
</FCParamGroup>
<FCParamGroup Name="Mesh">
<FCParamGroup Name="Asymptote">
<FCText Name="Width"/>
<FCText Name="Height"/>
</FCParamGroup>
<FCBool Name="TwoSideRendering" Value="0"/>
<FCBool Name="ShowBoundingBox" Value="0"/>
<FCUInt Name="MeshColor" Value="3435973887"/>
<FCUInt Name="LineColor" Value="255"/>
<FCUInt Name="BackfaceColor" Value="3435973887"/>
<FCInt Name="MeshTransparency" Value="0"/>
<FCInt Name="LineTransparency" Value="0"/>
<FCBool Name="VertexPerNormals" Value="0"/>
<FCFloat Name="CreaseAngle" Value="0.000000000000"/>
<FCFloat Name="MaxDeviationExport" Value="0.100000000000"/>
<FCBool Name="ExportAmfCompressed" Value="1"/>
</FCParamGroup>
<FCParamGroup Name="PartDesign">
<FCBool Name="RefineModel" Value="1"/>
</FCParamGroup>
<FCParamGroup Name="Sketcher">
<FCParamGroup Name="General">
<FCParamGroup Name="GridSize">
<FCText Name="Hist0">10.00 mm</FCText>
</FCParamGroup>
<FCBool Name="NotifyConstraintSubstitutions" Value="1"/>
<FCBool Name="ShowGrid" Value="0"/>
<FCBool Name="GridSnap" Value="0"/>
<FCBool Name="AutoConstraints" Value="1"/>
<FCBool Name="AvoidRedundantAutoconstraints" Value="1"/>
<FCInt Name="TopRenderGeometryId" Value="1"/>
<FCInt Name="MidRenderGeometryId" Value="2"/>
<FCInt Name="LowRenderGeometryId" Value="3"/>
<FCBool Name="HideDependent" Value="1"/>
<FCBool Name="ShowLinks" Value="1"/>
<FCBool Name="ShowSupport" Value="1"/>
<FCBool Name="RestoreCamera" Value="1"/>
</FCParamGroup>
<FCBool Name="ShowSolverAdvancedWidget" Value="0"/>
<FCBool Name="RecalculateInitialSolutionWhileDragging" Value="1"/>
<FCBool Name="LeaveSketchWithEscape" Value="1"/>
<FCBool Name="AutoRemoveRedundants" Value="0"/>
<FCBool Name="ShowDialogOnDistanceConstraint" Value="1"/>
<FCBool Name="ContinuousCreationMode" Value="1"/>
<FCBool Name="ContinuousConstraintMode" Value="1"/>
<FCBool Name="HideUnits" Value="0"/>
</FCParamGroup>
</FCParamGroup>
<FCParamGroup Name="HighDPI"/>
<FCParamGroup Name="OpenGL">
<FCBool Name="UseSoftwareOpenGL" Value="0"/>
</FCParamGroup>
<FCParamGroup Name="Bitmaps">
<FCParamGroup Name="Theme"/>
</FCParamGroup>
<FCParamGroup Name="View">
<FCText Name="GestureRollFwdCommand">Std_SelForward</FCText>
<FCText Name="GestureRollBackCommand">Std_SelBack</FCText>
<FCText Name="NavigationStyle">Gui::BlenderNavigationStyle</FCText>
<FCInt Name="AntiAliasing" Value="3"/>
<FCInt Name="RenderCache" Value="0"/>
<FCInt Name="TransparentObjectRenderType" Value="0"/>
<FCInt Name="MarkerSize" Value="9"/>
<FCBool Name="CornerCoordSystem" Value="1"/>
<FCBool Name="ShowAxisCross" Value="0"/>
<FCBool Name="SaveWBbyTab" Value="0"/>
<FCBool Name="ShowFPS" Value="0"/>
<FCFloat Name="PickRadius" Value="8.000000000000"/>
<FCBool Name="UseVBO" Value="0"/>
<FCFloat Name="EyeDistance" Value="5.000000000000"/>
<FCBool Name="EnableBacklight" Value="0"/>
<FCUInt Name="BacklightColor" Value="4294967295"/>
<FCInt Name="BacklightIntensity" Value="100"/>
<FCBool Name="Perspective" Value="0"/>
<FCBool Name="Orthographic" Value="1"/>
<FCInt Name="OrbitStyle" Value="1"/>
<FCInt Name="CornerNaviCube" Value="1"/>
<FCInt Name="RotationMode" Value="1"/>
<FCBool Name="ZoomAtCursor" Value="1"/>
<FCBool Name="InvertZoom" Value="1"/>
<FCBool Name="DisableTouchTilt" Value="1"/>
<FCFloat Name="ZoomStep" Value="0.200000000000"/>
<FCBool Name="UseAutoRotation" Value="0"/>
<FCFloat Name="NewDocumentCameraScale" Value="100.000000000000"/>
<FCInt Name="NaviStepByTurn" Value="8"/>
<FCBool Name="ShowNaviCube" Value="1"/>
<FCText Name="NewDocumentCameraOrientation">Trimetric</FCText>
<FCUInt Name="BackgroundColor" Value="1145324799"/>
<FCUInt Name="BackgroundColor2" Value="859006463"/>
<FCUInt Name="BackgroundColor3" Value="2543299327"/>
<FCUInt Name="BackgroundColor4" Value="1869583359"/>
<FCBool Name="Simple" Value="1"/>
<FCBool Name="Gradient" Value="0"/>
<FCBool Name="UseBackgroundColorMid" Value="0"/>
<FCBool Name="EnablePreselection" Value="1"/>
<FCBool Name="EnableSelection" Value="1"/>
<FCUInt Name="HighlightColor" Value="3789624575"/>
<FCUInt Name="SelectionColor" Value="481107199"/>
<FCUInt Name="DefaultShapeColor" Value="1650615039"/>
<FCBool Name="RandomColor" Value="0"/>
<FCUInt Name="DefaultShapeLineColor" Value="421075455"/>
<FCInt Name="DefaultShapeLineWidth" Value="2"/>
<FCUInt Name="DefaultShapeVertexColor" Value="421075455"/>
<FCInt Name="DefaultShapePointSize" Value="2"/>
<FCUInt Name="BoundingBoxColor" Value="4294967295"/>
<FCUInt Name="AnnotationTextColor" Value="3402287871"/>
<FCInt Name="EditSketcherFontSize" Value="17"/>
<FCFloat Name="ViewScalingFactor" Value="1.000000000000"/>
<FCInt Name="SegmentsPerGeometry" Value="50"/>
<FCUInt Name="SketchEdgeColor" Value="4294967295"/>
<FCUInt Name="SketchVertexColor" Value="4294967295"/>
<FCUInt Name="EditedEdgeColor" Value="4294967295"/>
<FCUInt Name="EditedVertexColor" Value="4280680703"/>
<FCUInt Name="ConstructionColor" Value="56575"/>
<FCUInt Name="ExternalColor" Value="3425924095"/>
<FCUInt Name="InvalidSketchColor" Value="4285333759"/>
<FCUInt Name="FullyConstrainedColor" Value="16711935"/>
<FCUInt Name="InternalAlignedGeoColor" Value="2998042623"/>
<FCUInt Name="FullyConstraintElementColor" Value="2161156351"/>
<FCUInt Name="FullyConstraintConstructionElementColor" Value="2410282495"/>
<FCUInt Name="FullyConstraintInternalAlignmentColor" Value="3739142399"/>
<FCUInt Name="FullyConstraintConstructionPointColor" Value="4287987967"/>
<FCUInt Name="ConstrainedIcoColor" Value="4280680703"/>
<FCUInt Name="NonDrivingConstrDimColor" Value="2555903"/>
<FCUInt Name="ConstrainedDimColor" Value="4280680703"/>
<FCUInt Name="ExprBasedConstrDimColor" Value="4286523135"/>
<FCUInt Name="DeactivatedConstrDimColor" Value="2139062271"/>
<FCUInt Name="CursorTextColor" Value="65535"/>
<FCUInt Name="CursorCrosshairColor" Value="4294967295"/>
<FCUInt Name="CreateLineColor" Value="3435973887"/>
</FCParamGroup>
<FCParamGroup Name="Document">
<FCBool Name="CreateNewDoc" Value="0"/>
<FCInt Name="CompressionLevel" Value="3"/>
<FCBool Name="UsingUndo" Value="1"/>
<FCInt Name="MaxUndoSize" Value="20"/>
<FCBool Name="SaveTransactions" Value="0"/>
<FCBool Name="TransactionsDiscard" Value="0"/>
<FCBool Name="SaveThumbnail" Value="0"/>
<FCInt Name="ThumbnailSize" Value="128"/>
<FCBool Name="AddThumbnailLogo" Value="1"/>
<FCBool Name="CreateBackupFiles" Value="1"/>
<FCInt Name="CountBackupFiles" Value="1"/>
<FCBool Name="UseFCBakExtension" Value="0"/>
<FCText Name="SaveBackupDateFormat">%Y%m%d-%H%M%S</FCText>
<FCBool Name="DuplicateLabels" Value="0"/>
<FCBool Name="NoPartialLoading" Value="0"/>
<FCInt Name="prefLicenseType" Value="0"/>
<FCText Name="prefLicenseUrl">http://en.wikipedia.org/wiki/All_rights_reserved</FCText>
<FCText Name="prefAuthor"/>
<FCBool Name="prefSetAuthorOnSave" Value="0"/>
<FCText Name="prefCompany"/>
<FCBool Name="RecoveryEnabled" Value="1"/>
<FCBool Name="AutoSaveEnabled" Value="1"/>
<FCInt Name="AutoSaveTimeout" Value="15"/>
<FCBool Name="CanAbortRecompute" Value="0"/>
</FCParamGroup>
<FCParamGroup Name="OutputWindow">
<FCUInt Name="colorText" Value="4294967295"/>
<FCBool Name="checkMessage" Value="1"/>
<FCBool Name="checkLogging" Value="0"/>
<FCBool Name="checkWarning" Value="1"/>
<FCBool Name="checkError" Value="1"/>
<FCBool Name="checkShowReportViewOnWarning" Value="1"/>
<FCBool Name="checkShowReportViewOnError" Value="1"/>
<FCBool Name="checkShowReportViewOnNormalMessage" Value="0"/>
<FCBool Name="checkShowReportViewOnLogMessage" Value="0"/>
<FCBool Name="checkShowReportTimecode" Value="1"/>
<FCUInt Name="colorLogging" Value="65535"/>
<FCUInt Name="colorWarning" Value="4289331455"/>
<FCUInt Name="colorError" Value="4278190335"/>
<FCBool Name="RedirectPythonOutput" Value="1"/>
<FCBool Name="RedirectPythonErrors" Value="1"/>
</FCParamGroup>
<FCParamGroup Name="DockWindows">
<FCParamGroup Name="TreeView">
<FCBool Name="Enabled" Value="0"/>
</FCParamGroup>
<FCParamGroup Name="PropertyView">
<FCBool Name="Enabled" Value="0"/>
</FCParamGroup>
<FCParamGroup Name="DAGView">
<FCBool Name="Enabled" Value="0"/>
</FCParamGroup>
<FCParamGroup Name="ComboView">
<FCBool Name="Enabled" Value="1"/>
</FCParamGroup>
</FCParamGroup>
<FCParamGroup Name="TreeView">
<FCBool Name="SyncView" Value="0"/>
<FCBool Name="SyncSelection" Value="0"/>
<FCBool Name="PreSelection" Value="0"/>
<FCBool Name="RecordSelection" Value="0"/>
<FCBool Name="CheckBoxesSelection" Value="0"/>
<FCUInt Name="TreeEditColor" Value="4294902015"/>
<FCUInt Name="TreeActiveColor" Value="3873898495"/>
</FCParamGroup>
<FCParamGroup Name="Expression"/>
<FCParamGroup Name="PropertyView"/>
<FCParamGroup Name="Editor">
<FCUInt Name="Text" Value="0"/>
<FCBool Name="EnableLineNumber" Value="1"/>
<FCBool Name="EnableFolding" Value="1"/>
<FCInt Name="TabSize" Value="4"/>
<FCInt Name="IndentSize" Value="4"/>
<FCBool Name="Tabs" Value="1"/>
<FCBool Name="Spaces" Value="0"/>
<FCUInt Name="Bookmark" Value="16776960"/>
<FCUInt Name="Breakpoint" Value="4278190080"/>
<FCUInt Name="Keyword" Value="65280"/>
<FCUInt Name="Comment" Value="11141120"/>
<FCUInt Name="Block comment" Value="2694882304"/>
<FCUInt Name="Number" Value="65280"/>
<FCUInt Name="String" Value="4278190080"/>
<FCUInt Name="Character" Value="4278190080"/>
<FCUInt Name="Class name" Value="4289331200"/>
<FCUInt Name="Define name" Value="4289331200"/>
<FCUInt Name="Operator" Value="2694882304"/>
<FCUInt Name="Python output" Value="2863300352"/>
<FCUInt Name="Python error" Value="4278190080"/>
<FCUInt Name="Current line highlight" Value="3772833792"/>
<FCInt Name="FontSize" Value="10"/>
<FCText Name="Font">Sans Serif</FCText>
</FCParamGroup>
<FCParamGroup Name="MainWindow">
<FCBool Name="TiledBackground" Value="0"/>
<FCText Name="StyleSheet">ProDark.qss</FCText>
</FCParamGroup>
<FCParamGroup Name="RecentFiles">
<FCText Name="MRU0">/home/rwxrob/Downloads/model.dae</FCText>
<FCInt Name="RecentFiles" Value="4"/>
</FCParamGroup>
<FCParamGroup Name="RecentMacros">
<FCInt Name="RecentMacros" Value="12"/>
<FCText Name="ShortcutModifiers"/>
<FCInt Name="ShortcutCount" Value="3"/>
</FCParamGroup>
<FCParamGroup Name="Browser"/>
<FCParamGroup Name="ParameterEditor">
<FCText Name="LastParameterGroup">BaseApp.Preferences.Document</FCText>
<FCText Name="Geometry">(2240,1282,3039,1881)</FCText>
</FCParamGroup>
<FCParamGroup Name="NaviCube"/>
<FCParamGroup Name="Dialog"/>
</FCParamGroup>
<FCParamGroup Name="Macro">
<FCParamGroup Name="Macros"/>
</FCParamGroup>
<FCParamGroup Name="MainWindow">
<FCParamGroup Name="DockWindows">
<FCBool Name="Std_ReportView" Value="1"/>
<FCBool Name="Std_SelectionView" Value="0"/>
<FCBool Name="Std_ComboView" Value="1"/>
<FCBool Name="Std_PythonView" Value="0"/>
</FCParamGroup>
<FCParamGroup Name="Toolbars">
<FCBool Name="File" Value="1"/>
<FCBool Name="Workbench" Value="1"/>
<FCBool Name="Macro" Value="1"/>
<FCBool Name="View" Value="1"/>
<FCBool Name="Structure" Value="1"/>
<FCBool Name="Navigation" Value="1"/>
<FCBool Name="Draft tray" Value="0"/>
<FCBool Name="Solids" Value="1"/>
<FCBool Name="Part tools" Value="1"/>
<FCBool Name="Boolean" Value="1"/>
<FCBool Name="Measure" Value="1"/>
<FCBool Name="Sketcher" Value="1"/>
<FCBool Name="Sketcher geometries" Value="1"/>
<FCBool Name="Sketcher constraints" Value="1"/>
<FCBool Name="Sketcher tools" Value="1"/>
<FCBool Name="Sketcher B-spline tools" Value="1"/>
<FCBool Name="Sketcher virtual space" Value="1"/>
<FCBool Name="Part Design Helper" Value="1"/>
<FCBool Name="Part Design Modeling" Value="1"/>
</FCParamGroup>
</FCParamGroup>
<FCParamGroup Name="Workbench"/>
<FCParamGroup Name="Workbenches"/>
</FCParamGroup>
<FCParamGroup Name="Tux">
<FCParamGroup Name="NavigationIndicator">
<FCBool Name="Compact" Value="0"/>
<FCBool Name="Tooltip" Value="1"/>
</FCParamGroup>
<FCParamGroup Name="PersistentToolbars">
<FCParamGroup Name="User">
<FCParamGroup Name="StartWorkbench"/>
<FCParamGroup Name="PartWorkbench"/>
<FCParamGroup Name="SketcherWorkbench"/>
<FCParamGroup Name="PartDesignWorkbench"/></FCParamGroup>
<FCParamGroup Name="System"/>
</FCParamGroup>
</FCParamGroup>
</FCParamGroup>
</FCParameters>

@ -0,0 +1,346 @@
#!/usr/bin/bash
# shellcheck disable=SC1090
case $- in
*i*) ;; # interactive
*) return ;;
esac
# ------------------------- distro detection -------------------------
export DISTRO
[[ $(uname -r) =~ Microsoft ]] && DISTRO=WSL2 #TODO distinguish WSL1
#TODO add the rest
# ---------------------- local utility functions ---------------------
_have() { type "$1" &>/dev/null; }
_source_if() { [[ -r "$1" ]] && source "$1"; }
# ----------------------- environment variables ----------------------
# (also see envx)
export USER="$(whoami)"
export GITUSER="$USER"
export REPOS="$HOME/Repos"
export GHREPOS="$REPOS/github.com/$GITUSER"
export DOTFILES="$GHREPOS/dot"
export SCRIPTS="$DOTFILES/scripts"
export SNIPPETS="$DOTFILES/snippets"
export HELP_BROWSER=lynx
export DESKTOP="$HOME/Desktop"
export DOCUMENTS="$HOME/Documents"
export DOWNLOADS="$HOME/Downloads"
export TEMPLATES="$HOME/Templates"
export PUBLIC="$HOME/Public"
export PRIVATE="$HOME/Private"
export PICTURES="$HOME/Pictures"
export MUSIC="$HOME/Music"
export VIDEOS="$HOME/Videos"
export PDFS="$DOCUMENTS/PDFS"
export VIRTUALMACHINES="$HOME/VirtualMachines"
export WORKSPACES="$HOME/Workspaces" # container home dirs for mounting
export ZETDIR="$GHREPOS/zet"
export ZETTELCASTS="$VIDEOS/ZettelCasts"
export CLIP_DIR="$VIDEOS/Clips"
export CLIP_DATA="$GHREPOS/cmd-clip/data"
export CLIP_VOLUME=0
export CLIP_SCREEN=0
export TERM=xterm-256color
export HRULEWIDTH=73
export EDITOR=vi
export VISUAL=vi
export EDITOR_PREFIX=vi
export GOPRIVATE="github.com/$GITUSER/*,gitlab.com/$GITUSER/*"
export GOPATH="$HOME/.local/share/go"
export GOBIN="$HOME/.local/bin"
export GOPROXY=direct
export CGO_ENABLED=0
export PYTHONDONTWRITEBYTECODE=2 # fucking shit-for-brains var name
export LC_COLLATE=C
export CFLAGS="-Wall -Wextra -Werror -O0 -g -fsanitize=address -fno-omit-frame-pointer -finstrument-functions"
export LESS_TERMCAP_mb="" # magenta
export LESS_TERMCAP_md="" # yellow
export LESS_TERMCAP_me="" # "0m"
export LESS_TERMCAP_se="" # "0m"
export LESS_TERMCAP_so="" # blue
export LESS_TERMCAP_ue="" # "0m"
export LESS_TERMCAP_us="" # underline
export ANSIBLE_INVENTORY="$HOME/.config/ansible/ansible_hosts"
[[ -d /.vim/spell ]] && export VIMSPELL=("$HOME/.vim/spell/*.add")
# -------------------------------- gpg -------------------------------
#export GPG_TTY=$(tty)
# ------------------------------- pager ------------------------------
if [[ -x /usr/bin/lesspipe ]]; then
export LESSOPEN="| /usr/bin/lesspipe %s";
export LESSCLOSE="/usr/bin/lesspipe %s %s";
fi
# ----------------------------- dircolors ----------------------------
if _have dircolors; then
if [[ -r "$HOME/.dircolors" ]]; then
eval "$(dircolors -b "$HOME/.dircolors")"
else
eval "$(dircolors -b)"
fi
fi
# ------------------------------- path -------------------------------
pathappend() {
declare arg
for arg in "$@"; do
test -d "$arg" || continue
PATH=${PATH//":$arg:"/:}
PATH=${PATH/#"$arg:"/}
PATH=${PATH/%":$arg"/}
export PATH="${PATH:+"$PATH:"}$arg"
done
} && export pathappend
pathprepend() {
for arg in "$@"; do
test -d "$arg" || continue
PATH=${PATH//:"$arg:"/:}
PATH=${PATH/#"$arg:"/}
PATH=${PATH/%":$arg"/}
export PATH="$arg${PATH:+":${PATH}"}"
done
} && export pathprepend
# remember last arg will be first in path
pathprepend \
/usr/local/go/bin \
"$HOME/.local/bin" \
"$GHREPOS/cmd-"* \
"$SCRIPTS"
pathappend \
/usr/local/opt/coreutils/libexec/gnubin \
'/mnt/c/Program Files/Oracle/VirtualBox' \
'/mnt/c/Windows' \
'/mnt/c/Program Files (x86)/VMware/VMware Workstation' \
/mingw64/bin \
/usr/local/bin \
/usr/local/sbin \
/usr/local/games \
/usr/games \
/usr/sbin \
/usr/bin \
/snap/bin \
/sbin \
/bin
# ------------------------------ cdpath ------------------------------
export CDPATH=".:$GHREPOS:$DOT:$REPOS:/media/$USER:$HOME"
# ------------------------ bash shell options ------------------------
shopt -s checkwinsize
shopt -s expand_aliases
shopt -s globstar
shopt -s dotglob
shopt -s extglob
#shopt -s nullglob # bug kills completion for some
#set -o noclobber
# ------------------------------ history -----------------------------
export HISTCONTROL=ignoreboth
export HISTSIZE=5000
export HISTFILESIZE=10000
set -o vi
shopt -s histappend
# --------------------------- smart prompt ---------------------------
# (keeping in bashrc for portability)
PROMPT_LONG=20
PROMPT_MAX=95
PROMPT_AT=@
__ps1() {
local P='$' dir="${PWD##*/}" B countme short long double\
r='\[\e[31m\]' g='\[\e[30m\]' h='\[\e[34m\]' \
u='\[\e[33m\]' p='\[\e[34m\]' w='\[\e[35m\]' \
b='\[\e[36m\]' x='\[\e[0m\]'
[[ $EUID == 0 ]] && P='#' && u=$r && p=$u # root
[[ $PWD = / ]] && dir=/
[[ $PWD = "$HOME" ]] && dir='~'
B=$(git branch --show-current 2>/dev/null)
[[ $dir = "$B" ]] && B=.
countme="$USER$PROMPT_AT$(hostname):$dir($B)\$ "
[[ $B = master || $B = main ]] && b="$r"
[[ -n "$B" ]] && B="$g($b$B$g)"
short="$u\u$g$PROMPT_AT$h\h$g:$w$dir$B$p$P$x "
#long="╔ $u\u$g$PROMPT_AT$h\h$g:$w$dir$B\n╚ $p$P$x "
long="${g}$u\u$g$PROMPT_AT$h\h$g:$w$dir$B\n${g}$p$P$x "
double="$g$u\u$g$PROMPT_AT$h\h$g:$w$dir\n$g$B\n$g$p$P$x "
if (( ${#countme} > PROMPT_MAX )); then
PS1="$double"
elif (( ${#countme} > PROMPT_LONG )); then
PS1="$long"
else
PS1="$short"
fi
}
PROMPT_COMMAND="__ps1"
# ----------------------------- keyboard -----------------------------
_have setxkbmap && test -n "$DISPLAY" && \
setxkbmap -option caps:escape &>/dev/null
# ------------------------------ aliases -----------------------------
# (use exec scripts instead, which work from vim and subprocs)
unalias -a
alias '?'=duck
alias '??'=google
alias '???'=bing
alias dot='cd $DOTFILES'
alias scripts='cd $SCRIPTS'
alias snippets='cd $SNIPPETS'
alias ls='ls -h --color=auto'
alias free='free -h'
alias df='df -h'
alias chmox='chmod +x'
alias sshh='sshpass -f $HOME/.sshpass ssh '
alias temp='cd $(mktemp -d)'
alias view='vi -R' # which is usually linked to vim
alias c='printf "\e[H\e[2J"'
alias clear='printf "\e[H\e[2J"'
alias coin="clip '(yes|no)'"
alias grep="grep -P"
alias minidockenv=". <(minikube docker-env)"
alias top=bashtop
alias iam=live
_have vim && alias vi=vim
# ----------------------------- functions ----------------------------
envx() {
local envfile="${1:-"$HOME/.env"}"
[[ ! -e "$envfile" ]] && echo "$envfile not found" && return 1
while IFS= read -r line; do
name=${line%%=*}
value=${line#*=}
[[ -z "${name}" || $name =~ ^# ]] && continue
export "$name"="$value"
done < "$envfile"
} && export -f envx
[[ -e "$HOME/.env" ]] && envx "$HOME/.env"
new-from() {
local template="$1"
local name="$2"
! _have gh && echo "gh command not found" && return 1
[[ -z "$name" ]] && echo "usage: $0 <name>" && return 1
[[ -z "$GHREPOS" ]] && echo "GHREPOS not set" && return 1
[[ ! -d "$GHREPOS" ]] && echo "Not found: $GHREPOS" && return 1
cd "$GHREPOS" || return 1
[[ -e "$name" ]] && echo "exists: $name" && return 1
gh repo create -p "$template" "$name"
cd "$name" || return 1
}
new-cmdbox() { new-from rwxrob/template-cmdbox "cmdbox-$1"; }
new-cmd() { new-from rwxrob/template-bash-command "cmd-$1"; }
cdz () { cd $(zet get "$@"); }
export -f new-from new-cmdbox new-cmd
clone() {
local repo="$1" user
local repo="${repo#https://github.com/}"
local repo="${repo#git@github.com:}"
if [[ $repo =~ / ]]; then
user="${repo%%/*}"
else
user="$GITUSER"
[[ -z "$user" ]] && user="$USER"
fi
local name="${repo##*/}"
local userd="$REPOS/github.com/$user"
local path="$userd/$name"
[[ -d "$path" ]] && cd "$path" && return
mkdir -p "$userd"
cd "$userd"
echo gh repo clone "$user/$name" -- --recurse-submodule
gh repo clone "$user/$name" -- --recurse-submodule
cd "$name"
} && export -f clone
# ------------- source external dependencies / completion ------------
owncomp=(
pdf md zet yt gl auth pomo config live iam sshkey ws x clip
./build build b ./k8sapp k8sapp ./setup ./cmd run ./run
)
for i in "${owncomp[@]}"; do complete -C "$i" "$i"; done
_have gh && . <(gh completion -s bash)
_have pandoc && . <(pandoc --bash-completion)
_have kubectl && . <(kubectl completion bash 2>/dev/null)
_have spotify && . <(spotify completion bash 2>/dev/null)
#_have clusterctl && . <(clusterctl completion bash)
_have k && complete -o default -F __start_kubectl k
_have kind && . <(kind completion bash)
_have kompose && . <(kompose completion bash)
_have yq && . <(yq shell-completion bash)
_have helm && . <(helm completion bash)
_have minikube && . <(minikube completion bash)
_have conftest && . <(conftest completion bash)
_have mk && complete -o default -F __start_minikube mk
_have podman && _source_if "$HOME/.local/share/podman/completion" # d
_have docker && _source_if "$HOME/.local/share/docker/completion" # d
_have docker-compose && complete -F _docker_compose dc # dc
# -------------------- personalized configuration --------------------
_source_if "$HOME/.bash_personal"
_source_if "$HOME/.bash_private"
_source_if "$HOME/.bash_work"
complete -C /usr/bin/terraform terraform
complete -C /usr/bin/terraform tf
# only use this if you really want libvirt (virtualbox does not need)
# vagrant(){
# docker run -it --rm \
# -e LIBVIRT_DEFAULT_URI \
# -v /var/run/libvirt/:/var/run/libvirt/ \
# -v ~/.vagrant.d:/.vagrant.d \
# -v $(realpath "${PWD}"):${PWD} \
# -w $(realpath "${PWD}") \
# --network host \
# vagrantlibvirt/vagrant-libvirt:latest \
# vagrant $@
# } && export -f vagrant
if _have vagrant; then
export VAGRANT_EXPERIMENTAL="disks"
# >>>> Vagrant command completion (start)
. /opt/vagrant/embedded/gems/2.2.19/gems/vagrant-2.2.19/contrib/bash/completion.sh
# <<<< Vagrant command completion (end)
complete -F _vagrant v
fi
export DISPLAY=:0.0 #GWSL
export PULSE_SERVER=tcp:localhost #GWSL

@ -0,0 +1,307 @@
COLOR tty
TERM ansi
TERM color_xterm
TERM color-xterm
TERM con132x25
TERM con132x30
TERM con132x43
TERM con132x60
TERM con80x25
TERM con80x28
TERM con80x30
TERM con80x43
TERM con80x50
TERM con80x60
TERM cons25
TERM console
TERM cygwin
TERM dtterm
TERM Eterm
TERM eterm-color
TERM fbterm
TERM gnome
TERM gnome-256color
TERM jfbterm
TERM konsole
TERM konsole-256color
TERM kterm
TERM linux
TERM linux-c
TERM mach-color
TERM mlterm
TERM nxterm
TERM putty
TERM putty-256color
TERM rxvt
TERM rxvt-256color
TERM rxvt-cygwin
TERM rxvt-cygwin-native
TERM rxvt-unicode
TERM rxvt-unicode256
TERM rxvt-unicode-256color
TERM screen
TERM screen-16color
TERM screen-16color-bce
TERM screen-16color-s
TERM screen-16color-bce-s
TERM screen-256color
TERM screen-256color-bce
TERM screen-256color-s
TERM screen-256color-bce-s
TERM screen-bce
TERM screen-w
TERM screen.linux
TERM screen.xterm-new
TERM st
TERM st-meta
TERM st-256color
TERM st-meta-256color
TERM vt100
TERM xterm
TERM xterm-new
TERM xterm-16color
TERM xterm-256color
TERM xterm-88color
TERM xterm-color
TERM xterm-debian
TERM xterm-termite
EIGHTBIT 1
NORMAL 00
FILE 00
DIR 34
OTHER_WRITABLE 34;40
LINK 35
FIFO 30;44
SOCK 35;44
DOOR 35;44 # Solaris 2.5 and later
BLK 33;44
CHR 37;44
ORPHAN 05;37;41
MISSING 05;37;41
EXEC 31 # Unix
.cmd 31 # Win
.exe 31 # Win
.com 31 # Win
.bat 31 # Win
.reg 31 # Win
.app 31 # OSX
.txt 32
.org 32
.md 32
.mkd 32
.h 32
.c 32
.C 32
.cc 32
.cpp 32
.cxx 32
.objc 32
.sh 32
.bash 32
.csh 32
.zsh 32
.el 32
.vim 32
.java 32
.pl 32
.pm 32
.py 32
.rb 32
.hs 32
.php 32
.htm 32
.html 32
.shtml 32
.erb 32
.haml 32
.xml 32
.rdf 32
.css 32
.sass 32
.scss 32
.less 32
.js 32
.coffee 32
.man 32
.0 32
.1 32
.2 32
.3 32
.4 32
.5 32
.6 32
.7 32
.8 32
.9 32
.l 32
.n 32
.p 32
.pod 32
.tex 32
### Multimedia formats
# Image
.bmp 33
.cgm 33
.dl 33
.dvi 33
.emf 33
.eps 33
.gif 33
.jpeg 33
.jpg 33
.JPG 33
.mng 33
.pbm 33
.pcx 33
.pdf 33
.pgm 33
.png 33
.ppm 33
.pps 33
.ppsx 33
.ps 33
.svg 33
.svgz 33
.tga 33
.tif 33
.tiff 33
.xbm 33
.xcf 33
.xpm 33
.xwd 33
.xwd 33
.yuv 33
# Audio
.aac 33
.au 33
.flac 33
.mid 33
.midi 33
.mka 33
.mp3 33
.mpa 33
.mpeg 33
.mpg 33
.ogg 33
.ra 33
.wav 33
# Video
.anx 33
.asf 33
.avi 33
.axv 33
.flc 33
.fli 33
.flv 33
.gl 33
.m2v 33
.m4v 33
.mkv 33
.mov 33
.mp4 33
.mp4v 33
.mpeg 33
.mpg 33
.nuv 33
.ogm 33
.ogv 33
.ogx 33
.qt 33
.rm 33
.rmvb 33
.swf 33
.vob 33
.wmv 33
### Misc
# Binary document formats and multimedia source
.doc 31
.docx 31
.rtf 31
.dot 31
.dotx 31
.xls 31
.xlsx 31
.ppt 31
.pptx 31
.fla 31
.psd 31
# Archives, compressed
.7z 1;35
.apk 1;35
.arj 1;35
.bin 1;35
.bz 1;35
.bz2 1;35
.cab 1;35 # Win
.deb 1;35
.dmg 1;35 # OSX
.gem 1;35
.gz 1;35
.iso 1;35
.jar 1;35
.msi 1;35 # Win
.rar 1;35
.rpm 1;35
.tar 1;35
.tbz 1;35
.tbz2 1;35
.tgz 1;35
.tx 1;35
.war 1;35
.xpi 1;35
.xz 1;35
.z 1;35
.Z 1;35
.zip 1;35
# For testing
.ANSI-30-black 30
.ANSI-01;30-brblack 01;30
.ANSI-31-red 31
.ANSI-01;31-brred 01;31
.ANSI-32-green 32
.ANSI-01;32-brgreen 01;32
.ANSI-33-yellow 33
.ANSI-01;33-bryellow 01;33
.ANSI-34-blue 34
.ANSI-01;34-brblue 01;34
.ANSI-35-magenta 35
.ANSI-01;35-brmagenta 01;35
.ANSI-36-cyan 36
.ANSI-01;36-brcyan 01;36
.ANSI-37-white 37
.ANSI-01;37-brwhite 01;37
.log 01;32
*~ 01;32
*# 01;32
.bak 01;33
.BAK 01;33
.old 01;33
.OLD 01;33
.org_archive 01;33
.off 01;33
.OFF 01;33
.dist 01;33
.DIST 01;33
.orig 01;33
.ORIG 01;33
.swp 01;33
.swo 01;33
*,v 01;33
.gpg 34
.gpg 34
.pgp 34
.asc 34
.3des 34
.aes 34
.enc 34

@ -0,0 +1,3 @@
.
!Dockerfile
!install

@ -0,0 +1,5 @@
# This is Git's per-user configuration file.
[user]
# Please adapt and uncomment the following lines:
name = Rob Muhlestein
email = rob@rwx.gg

@ -0,0 +1,14 @@
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: rwxrob
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with the name of a liberpay project
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom:
- https://twitch.tv/rwxrob
- https://youtube.com/rwxrob

@ -0,0 +1,4 @@
# particularly useful for psql
set editing-mode vi
#set bell-style none # MAKE IT STOP!!
set keymap vi

@ -0,0 +1,9 @@
# This file is only here because some brain-dead
# applications require it.
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi

36
DCO

@ -0,0 +1,36 @@
Developer Certificate of Origin
Version 1.1
Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
1 Letterman Drive
Suite D4700
San Francisco, CA, 94129
Everyone is permitted to copy and distribute verbatim copies of this
license document, but changing it is not allowed.
Developer's Certificate of Origin 1.1
By making a contribution to this project, I certify that:
(a) The contribution was created in whole or in part by me and I
have the right to submit it under the open source license
indicated in the file; or
(b) The contribution is based upon previous work that, to the best
of my knowledge, is covered under an appropriate open source
license and I have the right under that license to submit that
work with modifications, whether created in whole or in part
by me, under the same open source license (unless I am
permitted to submit under a different license), as indicated
in the file; or
(c) The contribution was provided directly to me by some other
person who certified (a), (b) or (c) and I have not modified
it.
(d) I understand and agree that this project and the contribution
are public and that a record of the contribution (including all
personal information I submit with it, including my sign-off) is
maintained indefinitely and may be redistributed consistent with
this project or the open source license(s) involved.

@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2020 Rob Muhlestein
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

@ -0,0 +1,28 @@
# Personal Dotfiles and Scripts
Pilfer at your own peril. Mention <https://rwxrob.tv> if you do. Stop by
and chat sometime.
## Installation
For installation information and sampling see the [workspace container]
that depends on this repo.
Also see the [scripts `README.md` Installation][scripts] as well.
[workspace container]: <https://github.com/rwxrob/workspace>
[scripts]: scripts/#installation
## More Information
For questions about design decisions and setup consider my [zet notes]
and [streaming faq].
[zet notes]: <https://github.com/rwxrob/zet>
[streaming faq]: <https://github.com/rwxrob/faq>
## Legal
Copyright 2021 Rob Muhlestein <rob@rwx.gg>
Released under Apache-1.0 License
Please mention <https://rwxrob.tv>

@ -0,0 +1,6 @@
# My Ansible Stuff
> ⚠️
> A lot of this is duplicated in the installer files (for now) until
> I can migrate it all over.

@ -0,0 +1,3 @@
# Docker Completion
Add `d` to the `complete` line at the end.

File diff suppressed because it is too large Load Diff

@ -0,0 +1,3 @@
#!/bin/sh
mkdir -p ~/.local/share/docker
ln -fs "$PWD/completion" ~/.local/share/docker/completion

@ -0,0 +1,41 @@
git_protocol: ssh
editor: vim
prompt: enabled
pager: less
aliases:
co: pr checkout
del: |
!gh api -X DELETE "repos/$GITUSER/$1"
priv: |
!gh api -X PATCH "repos/$GITUSER/$1" -f private="true" | jq .private
pub: |
!gh api -X PATCH "repos/$GITUSER/$1" -f private="false" | jq .private
status: |
!gh api graphql -f emoji="${1%% *}" -f msg="${1#* }" -f query='mutation ($msg: String!, $emoji: String) {changeUserStatus(input:{message:$msg,emoji:$emoji}) {status { message, emoji }}}'
repos: |
!gh api --paginate graphql -f owner="$1" -f query='
query($owner: String!, $per_page: Int = 100, $endCursor: String) {
repositoryOwner(login: $owner) {
repositories(first: $per_page, after: $endCursor, ownerAffiliations: OWNER) {
nodes { nameWithOwner }
pageInfo { hasNextPage endCursor }
}
}
}
' | jq -r '.data.repositoryOwner.repositories.nodes[].nameWithOwner' | sort
orgs: |
!gh api --paginate graphql -f query='
query {
viewer {
id
name
organizations(first: 100) {
nodes {
id
name
}
}
}
} ' | jq -r '.data.viewer.organizations[][] | .id + " " + .name'
defmain: |
!gh api -X PATCH "repos/$1" -f default_branch="main" | jq .default_branch

@ -0,0 +1,5 @@
#!/bin/sh
mkdir -p ~/.config/gh 2>/dev/null
ln -fs "$PWD/config.yml" "$HOME/.config/gh/config.yml"
ls -l ~/.config/gh
echo 'You might need to do gh auth --with-token $(auth token github)'

@ -0,0 +1,7 @@
#!/bin/sh
# branch="$(git branch --show-current)"
# if test "${branch}" = "master" -o "${branch}" = "main"; then
# echo "Cowardly refusing to commit on ${branch} branch."
# echo "You can delete this pre-hook or do it right."
# exit 1
# fi

@ -0,0 +1,3 @@
#!/bin/sh
rm -rf "$HOME/.git-templates"
ln -sf "$PWD/.git-templates" "$HOME/.git-templates"

@ -0,0 +1,244 @@
cat.509670=Science & Technology
cat.29595=Dota 2
cat.509658=Just Chatting
cat.115977=The Witcher 3: Wild Hunt
cat.1469308723=Software and Game Development
cat.16676=Team Fortress 2
cat.493575=SHENZHEN I/O
cat.272263131=Animals, Aquariums, and Zoos
cat.509671=Fitness & Health
cat.26936=Music
cat.509660=Art
cat.515214=Politics
cat.417752=Talk Shows & Podcasts
cat.498592=I'm Only Sleeping
cat.509672=Travel & Outdoors
cat.509673=Makers & Crafting
tag.linux=15f4833a-1691-4cc1-a4a5-020d130ac94d
tag.ama=67259b26-ff83-444e-9d3c-faab390df16f
tag.coworking=0739209c-9ef5-4ae0-997c-ccbeb864ca61
tag.business=c38aeb6e-e8c7-452a-88e1-a3ed62c2e846
tag.cooperative=63e83904-a70b-4709-b963-a37a105d9932
tag.programming=a51f1e4e-257b-4bd0-90c7-189c3efbf917
tag.educational=cea7bc0c-75a5-4446-8743-6db031b71550
tag.writing=81975ba3-5c53-41f8-b614-ce5b3193955a
tag.editing=325a32c7-7b8e-48f8-b4fa-10875f18bb6d
tag.cozy=adc4a830-07f5-457b-95e5-5ab6cc1f9af3
tag.skateboarding=fd6df368-7e76-4868-b9e9-b4f7cecc2f35
tag.cycling=d5713b1e-c796-4bdc-88e2-93c49ce31136
tag.animation=e3a6b378-232b-4ec2-9a82-86b72851e09a
tag.evil=0cef8341-8c67-481f-95a8-325932a6699c
tag.good=ee1daaae-116a-44d6-9f40-09322caf3181
tag.endurance=3379ff9c-3c15-4bef-bfb8-2085cd196062
tag.engineering=dff0aca6-52fe-4cc4-a93a-194852b522f0
tag.backseating=96b6073f-450d-4248-8ed4-988e28f3f759
tag.balance=8315b8d6-9837-4218-9bc1-3c0a3e5bb41d
tag.100=e659959d-392f-44c5-83a5-fb959cdbaccc
tag.achievements=27937cec-5cfc-4f56-b1d3-f6e1d67735e2
tag.acoustic=eea4d45b-52e0-4a16-b0df-64f4c55bc716
tag.behindscenes=26befb18-4ddc-41c1-8d39-ffeada297428
tag.bodypositive=150f13a5-b1ce-4e85-a61f-7cfed2e2e08c
tag.chatty=afc8211a-8eee-48b8-9e18-212f22f657db
tag.chill=81e9d348-82e5-4c4f-a140-d2b3779b912d
tag.explore=a4fac2cc-7cd4-44a6-b620-178182389a5b
tag.filming=812a0088-22a9-4944-bb27-af0fa37b6085
tag.firstplay=d0976a7e-26a7-4a48-9225-c522808540f2
tag.gamedev=f588bd74-e496-4d11-9169-3597f38a5d25
tag.softdev=6f86127d-6051-4a38-94bb-f7b475dde109
tag.webdev=c23ce252-cf78-4b98-8c11-8769801aaf3a
tag.graphicdesign=0930677c-dd75-424d-9190-b779f3d1c136
tag.hiking=2a824c85-8c64-4a62-9532-84a50633c6fc
tag.interviews=c833db83-32d0-4026-b3df-637ccf7899fa
tag.play=8ba227ca-073c-46a7-b3cc-193e52c5ab4d
tag.playwith=ac763b17-7bea-4632-9eb4-d106689ff409
tag.leveling=6433db3e-37a7-4590-915a-7c0949a4ac89
tag.vlogging=7a3d677a-1e09-4391-b520-1fccc0e7d6ca
tag.magic=1b70fcca-0579-446a-90d1-075c9ce62309
tag.meditation=59b9c259-62c3-4a1a-89d4-4a6f1070deb9
tag.mindfulness=9801169b-afa4-4785-890e-53911955e4d7
tag.mealprep=3ce58361-f147-441d-a7c9-e98e3e916a39
tag.movement=73645e21-02ae-4f39-bfb1-8dac623927ef
tag.musictalk=85d2fb8f-7257-4e08-8065-6161fa3029fa
tag.musicevents=c5247b10-deec-4d7a-84a5-db6a75cb5908
tag.news=77017b7b-6b98-4f0d-bd39-3ba96b66ec7a
tag.outdoors=89e105c9-2c45-42a9-a5f0-fc1ea6e7ba8b
tag.practice=04b4aaaa-c410-4c2e-9beb-da3896fc7d22
tag.reading=bd6fc011-575a-43f0-8418-9f912a295362
tag.retro=e027fb8b-219e-4959-8240-a4a082be0316
tag.robotics=56257f86-a66c-4ce8-af6d-89e9b1f13fed
tag.safespace=3575df89-da01-4fc1-939c-b5465093ed04
tag.spirituality=63f8ee17-1678-41ee-906a-8c55c3ce81df
tag.strength=07a1b526-3725-4ba5-8c53-efaad4941fb9
tag.surfing=8e44481a-4bc4-4155-b362-9bb499c15d3e
tag.tradart=5ec52c4f-a055-404c-82fe-ea98c74c7fe6
tag.travel=a6ff589a-33e5-4caf-8286-29dea98fc2e2
tag.tutorial=dc709206-c072-4340-a706-694578574c7e
tag.twitchcon=f317a85e-495e-4aee-a0d2-0720bd00a6ce
tag.usa=79713d37-6d2e-4953-b55b-8f47bb9caf72
tag.vectorart=f0ab2b07-14ed-4429-8ea3-3d7d400a50cd
tag.viewerlevels=fec05015-e841-4cff-a53c-8aa1336cf863
tag.warmingup=2920fbf2-293e-4753-8ec7-b69dba5392d0
tag.wargame=dbe20395-0e44-4156-92de-4a77f6cdccf0
tag.worldbuild=218c5e0e-e3a9-4fab-9ad5-994717d226fd
tag.easy=1eea2343-ca8e-4606-ab21-5c64e129f6db
tag.hard=ba2c968b-867a-49ce-aebc-3d978a204f4a
tag.beginners=ad18ee82-c0b2-46d4-b4f9-d45994443bd7
tag.casuals=cc8d5abb-39c9-4942-a1ee-e1558512119e
tag.allbosses=860f0dc1-5d6b-4504-a3e2-eca15a1cb816
tag.epic=df262ff6-74d1-415b-942c-d584d44426c4
mode.away.emoji=🐟
mode.away.name=away
mode.away.status=fishies and music
mode.away.flags=music|visual
mode.away.category=272263131
mode.away.tags=linux,animation
mode.break.emoji=💤
mode.break.name=break
mode.break.status=taking a break (< 30 minutes)
mode.break.flags=music | visual
mode.break.category=same
mode.break.tags=
mode.yoga.emoji=🧘
mode.yoga.name=yoga
mode.yoga.status=ashtanga yoga asana (mysore style)
mode.yoga.flags=cam | mic | music | chat | focused
mode.yoga.category=509671
mode.yoga.tags=
mode.run.emoji=🏃
mode.run.name=run
mode.run.status=out running
mode.run.flags=cam | mic | chat | ama | out
mode.run.category=509658
mode.run.tags=
mode.skate.emoji=🛹
mode.skate.name=skate
mode.skate.status=out long-boarding
mode.skate.flags=cam | mic | chat | ama | out
mode.skate.category=509658
mode.skate.tags=
mode.bike.emoji=🚴
mode.bike.name=bike
mode.bike.status=out cycling
mode.bike.flags=cam | mic | chat | ama | out
mode.bike.category=509658
mode.bike.tags=
mode.work.emoji=🏢
mode.work.name=work
mode.work.status=kubernetes coworking
mode.work.flags=cam | mic | chat | focused | music | muted
mode.work.category=null
mode.work.tags=co-working
mode.code.emoji=💢
mode.code.name=code
mode.code.status=bash, go, c, or web
mode.code.flags=cam | mic | chat | topical | music
mode.code.category=null
mode.code.tags=programming
mode.hack.emoji=🥷
mode.hack.name=hack
mode.hack.status=hacking to learn
mode.hack.flags=cam | mic | chat | ama | music
mode.hack.category=null
mode.hack.tags=
mode.write.emoji=⌨️
mode.write.name=write
mode.write.status=writing
mode.write.flags=cam | mic | chat | focused | topical | music
mode.write.category=509658
mode.write.tags=
mode.rant.emoji=🤬
mode.rant.name=rant
mode.rant.status=ranting
mode.rant.flags=cam | mic | chat | focused | topical | music
mode.rant.category=509658
mode.rant.tags=evil
mode.clean.emoji=😐
mode.clean.name=clean
mode.clean.status=cleaning lab/studio
mode.clean.flags=cam | mic | chat | music | ama
mode.clean.category=509658
mode.clean.tags=
mode.dota2.emoji=⚔️
mode.dota2.name=dota2
mode.dota2.status=crystal, legion, chant, np, *ama chat*
mode.dota2.flags=
mode.dota2.category=null
mode.dota2.tags=
mode.witcher3.emoji=🐺
mode.witcher3.name=witcher3
mode.witcher3.status=cat school, triss line, *ama chat*
mode.witcher3.flags=
mode.witcher3.category=null
mode.witcher3.tags=
mode.shenzen.emoji=🔢
mode.shenzen.name=shenzen
mode.shenzen.status=learning assembly-ish, *ama chat*
mode.shenzen.flags=
mode.shenzen.category=null
mode.shenzen.tags=
mode.tf2.emoji=🏹
mode.tf2.name=tf2
mode.tf2.status=bow sniper, engie, pyro, *ama chat*
mode.tf2.flags=
mode.tf2.category=null
mode.tf2.tags=
mode.learn.emoji=🤯
mode.learn.name=learn
mode.learn.status=colearning, *topic chat* to help
mode.learn.flags=
mode.learn.category=null
mode.learn.tags=
mode.party.emoji=🎉
mode.party.name=party
mode.party.status=music, dancing, drinking, *ama chat*
mode.party.flags=
mode.party.category=509658
mode.party.tags=
mode.jaunt.emoji=🌤️
mode.jaunt.name=jaunt
mode.jaunt.status=walk/talk, tours, adventures, *ama chat*
mode.jaunt.flags=
mode.jaunt.category=509658
mode.jaunt.tags=
mode.art.emoji=🎨
mode.art.name=art
mode.art.status=galleries, crawls, interviews, *topic chat*
mode.art.flags=
mode.art.category=509660
mode.art.tags=
mode.music.emoji=🎵
mode.music.name=music
mode.music.status=live music, pubs, *ama chat*
mode.music.flags=
mode.music.category=26936
mode.music.tags=
mode.course.emoji=⚡
mode.course.name=course
mode.course.status=instructional content, *topic chat*
mode.course.flags=
mode.course.category=null
mode.course.tags=
mode.morning.emoji=☕
mode.morning.name=morning
mode.morning.status=cozy, wake-up, plan, news, *ama chat*
mode.morning.flags=
mode.morning.category=509658
mode.morning.tags=
mode.talk.emoji=☎️
mode.talk.name=talk
mode.talk.status=invited guests in discord, *topic ama*
mode.talk.flags=
mode.talk.category=417752
mode.talk.tags=
mode.hang.emoji=🍻
mode.hang.name=hang
mode.hang.status=discord lobby, members only, *ama chat*
mode.hang.flags=
mode.hang.category=509658
mode.hang.tags=
mode.record.emoji=🎬
mode.record.name=record
mode.record.status=make specific youtube videos, *no chat*
mode.record.flags=
mode.record.category=null
mode.record.tags=

@ -0,0 +1,3 @@
#!/bin/bash
mkdir -p ~/.config/iam
ln -fs "$PWD/config.yaml" ~/.config/iam/config.yaml

@ -0,0 +1,7 @@
# Install Scripts
Here are some installer scripts I've collected and use to build my
workspace image and vm. It is nice to have these separated out because
sometimes I just want to install on hardware or WSL2 or something and
don't have Docker.

@ -0,0 +1,6 @@
#!/bin/bash
sudo add-apt-repository --yes --update ppa:ansible/ansible
sudo apt install ansible
sudo apt install python3-argcomplete
sudo activate-global-python-argcomplete3

@ -0,0 +1,511 @@
#!/bin/sh
set -e
# Docker CE for Linux installation script
#
# See https://docs.docker.com/install/ for the installation steps.
#
# This script is meant for quick & easy install via:
# $ curl -fsSL https://get.docker.com -o get-docker.sh
# $ sh get-docker.sh
#
# For test builds (ie. release candidates):
# $ curl -fsSL https://test.docker.com -o test-docker.sh
# $ sh test-docker.sh
#
# NOTE: Make sure to verify the contents of the script
# you downloaded matches the contents of install.sh
# located at https://github.com/docker/docker-install
# before executing.
#
# Git commit from https://github.com/docker/docker-install when
# the script was uploaded (Should only be modified by upload job):
SCRIPT_COMMIT_SHA="3d8fe77c2c46c5b7571f94b42793905e5b3e42e4"
# The channel to install from:
# * nightly
# * test
# * stable
# * edge (deprecated)
DEFAULT_CHANNEL_VALUE="stable"
if [ -z "$CHANNEL" ]; then
CHANNEL=$DEFAULT_CHANNEL_VALUE
fi
DEFAULT_DOWNLOAD_URL="https://download.docker.com"
if [ -z "$DOWNLOAD_URL" ]; then
DOWNLOAD_URL=$DEFAULT_DOWNLOAD_URL
fi
DEFAULT_REPO_FILE="docker-ce.repo"
if [ -z "$REPO_FILE" ]; then
REPO_FILE="$DEFAULT_REPO_FILE"
fi
mirror=''
DRY_RUN=${DRY_RUN:-}
while [ $# -gt 0 ]; do
case "$1" in
--mirror)
mirror="$2"
shift
;;
--dry-run)
DRY_RUN=1
;;
--*)
echo "Illegal option $1"
;;
esac
shift $(($# > 0 ? 1 : 0))
done
case "$mirror" in
Aliyun)
DOWNLOAD_URL="https://mirrors.aliyun.com/docker-ce"
;;
AzureChinaCloud)
DOWNLOAD_URL="https://mirror.azure.cn/docker-ce"
;;
esac
command_exists() {
command -v "$@" >/dev/null 2>&1
}
is_dry_run() {
if [ -z "$DRY_RUN" ]; then
return 1
else
return 0
fi
}
is_wsl() {
case "$(uname -r)" in
*microsoft*) true ;; # WSL 2
*Microsoft*) true ;; # WSL 1
*) false ;;
esac
}
is_darwin() {
case "$(uname -s)" in
*darwin*) true ;;
*Darwin*) true ;;
*) false ;;
esac
}
deprecation_notice() {
distro=$1
date=$2
echo
echo "DEPRECATION WARNING:"
echo " The distribution, $distro, will no longer be supported in this script as of $date."
echo " If you feel this is a mistake please submit an issue at https://github.com/docker/docker-install/issues/new"
echo
sleep 10
}
get_distribution() {
lsb_dist=""
# Every system that we officially support has /etc/os-release
if [ -r /etc/os-release ]; then
lsb_dist="$(. /etc/os-release && echo "$ID")"
fi
# Returning an empty string here should be alright since the
# case statements don't act unless you provide an actual value
echo "$lsb_dist"
}
add_debian_backport_repo() {
debian_version="$1"
backports="deb http://ftp.debian.org/debian $debian_version-backports main"
if ! grep -Fxq "$backports" /etc/apt/sources.list; then
(
set -x
$sh_c "echo \"$backports\" >> /etc/apt/sources.list"
)
fi
}
echo_docker_as_nonroot() {
if is_dry_run; then
return
fi
if command_exists docker && [ -e /var/run/docker.sock ]; then
(
set -x
$sh_c 'docker version'
) || true
fi
your_user=your-user
[ "$user" != 'root' ] && your_user="$user"
# intentionally mixed spaces and tabs here -- tabs are stripped by "<<-EOF", spaces are kept in the output
echo "If you would like to use Docker as a non-root user, you should now consider"
echo "adding your user to the \"docker\" group with something like:"
echo
echo " sudo usermod -aG docker $your_user"
echo
echo "Remember that you will have to log out and back in for this to take effect!"
echo
echo "WARNING: Adding a user to the \"docker\" group will grant the ability to run"
echo " containers which can be used to obtain root privileges on the"
echo " docker host."
echo " Refer to https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface"
echo " for more information."
}
# Check if this is a forked Linux distro
check_forked() {
# Check for lsb_release command existence, it usually exists in forked distros
if command_exists lsb_release; then
# Check if the `-u` option is supported
set +e
lsb_release -a -u >/dev/null 2>&1
lsb_release_exit_code=$?
set -e
# Check if the command has exited successfully, it means we're in a forked distro
if [ "$lsb_release_exit_code" = "0" ]; then
# Print info about current distro
cat <<-EOF
You're using '$lsb_dist' version '$dist_version'.
EOF
# Get the upstream release info
lsb_dist=$(lsb_release -a -u 2>&1 | tr '[:upper:]' '[:lower:]' | grep -E 'id' | cut -d ':' -f 2 | tr -d '[:space:]')
dist_version=$(lsb_release -a -u 2>&1 | tr '[:upper:]' '[:lower:]' | grep -E 'codename' | cut -d ':' -f 2 | tr -d '[:space:]')
# Print info about upstream distro
cat <<-EOF
Upstream release is '$lsb_dist' version '$dist_version'.
EOF
else
if [ -r /etc/debian_version ] && [ "$lsb_dist" != "ubuntu" ] && [ "$lsb_dist" != "raspbian" ]; then
if [ "$lsb_dist" = "osmc" ]; then
# OSMC runs Raspbian
lsb_dist=raspbian
else
# We're Debian and don't even know it!
lsb_dist=debian
fi
dist_version="$(sed 's/\/.*//' /etc/debian_version | sed 's/\..*//')"
case "$dist_version" in
10)
dist_version="buster"
;;
9)
dist_version="stretch"
;;
8 | 'Kali Linux 2')
dist_version="jessie"
;;
esac
fi
fi
fi
}
semverParse() {
major="${1%%.*}"
minor="${1#$major.}"
minor="${minor%%.*}"
patch="${1#$major.$minor.}"
patch="${patch%%[-.]*}"
}
do_install() {
echo "# Executing docker install script, commit: $SCRIPT_COMMIT_SHA"
if command_exists docker; then
docker_version="$(docker -v | cut -d ' ' -f3 | cut -d ',' -f1)"
MAJOR_W=1
MINOR_W=10
semverParse "$docker_version"
shouldWarn=0
if [ "$major" -lt "$MAJOR_W" ]; then
shouldWarn=1
fi
if [ "$major" -le "$MAJOR_W" ] && [ "$minor" -lt "$MINOR_W" ]; then
shouldWarn=1
fi
cat >&2 <<-'EOF'
Warning: the "docker" command appears to already exist on this system.
If you already have Docker installed, this script can cause trouble, which is
why we're displaying this warning and provide the opportunity to cancel the
installation.
If you installed the current Docker package using this script and are using it
EOF
if [ $shouldWarn -eq 1 ]; then
cat >&2 <<-'EOF'
again to update Docker, we urge you to migrate your image store before upgrading
to v1.10+.
You can find instructions for this here:
https://github.com/docker/docker/wiki/Engine-v1.10.0-content-addressability-migration
EOF
else
cat >&2 <<-'EOF'
again to update Docker, you can safely ignore this message.
EOF
fi
cat >&2 <<-'EOF'
You may press Ctrl+C now to abort this script.
EOF
(
set -x
sleep 20
)
fi
user="$(id -un 2>/dev/null || true)"
sh_c='sh -c'
if [ "$user" != 'root' ]; then
if command_exists sudo; then
sh_c='sudo -E sh -c'
elif command_exists su; then
sh_c='su -c'
else
cat >&2 <<-'EOF'
Error: this installer needs the ability to run commands as root.
We are unable to find either "sudo" or "su" available to make this happen.
EOF
exit 1
fi
fi
if is_dry_run; then
sh_c="echo"
fi
# perform some very rudimentary platform detection
lsb_dist=$(get_distribution)
lsb_dist="$(echo "$lsb_dist" | tr '[:upper:]' '[:lower:]')"
if is_wsl; then
echo
echo "WSL DETECTED: We recommend using Docker Desktop for Windows."
echo "Please get Docker Desktop from https://www.docker.com/products/docker-desktop"
echo
cat >&2 <<-'EOF'
You may press Ctrl+C now to abort this script.
EOF
(
set -x
sleep 20
)
fi
case "$lsb_dist" in
ubuntu)
if command_exists lsb_release; then
dist_version="$(lsb_release --codename | cut -f2)"
fi
if [ -z "$dist_version" ] && [ -r /etc/lsb-release ]; then
dist_version="$(. /etc/lsb-release && echo "$DISTRIB_CODENAME")"
fi
;;
debian | raspbian)
dist_version="$(sed 's/\/.*//' /etc/debian_version | sed 's/\..*//')"
case "$dist_version" in
10)
dist_version="buster"
;;
9)
dist_version="stretch"
;;
8)
dist_version="jessie"
;;
esac
;;
centos | rhel)
if [ -z "$dist_version" ] && [ -r /etc/os-release ]; then
dist_version="$(. /etc/os-release && echo "$VERSION_ID")"
fi
;;
*)
if command_exists lsb_release; then
dist_version="$(lsb_release --release | cut -f2)"
fi
if [ -z "$dist_version" ] && [ -r /etc/os-release ]; then
dist_version="$(. /etc/os-release && echo "$VERSION_ID")"
fi
;;
esac
# Check if this is a forked Linux distro
check_forked
# Run setup for each distro accordingly
case "$lsb_dist" in
ubuntu | debian | raspbian)
pre_reqs="apt-transport-https ca-certificates curl"
if [ "$lsb_dist" = "debian" ]; then
# libseccomp2 does not exist for debian jessie main repos for aarch64
if [ "$(uname -m)" = "aarch64" ] && [ "$dist_version" = "jessie" ]; then
add_debian_backport_repo "$dist_version"
fi
fi
if ! command -v gpg >/dev/null; then
pre_reqs="$pre_reqs gnupg"
fi
apt_repo="deb [arch=$(dpkg --print-architecture)] $DOWNLOAD_URL/linux/$lsb_dist $dist_version $CHANNEL"
(
if ! is_dry_run; then
set -x
fi
$sh_c 'apt-get update -qq >/dev/null'
$sh_c "DEBIAN_FRONTEND=noninteractive apt-get install -y -qq $pre_reqs >/dev/null"
$sh_c "curl -fsSL \"$DOWNLOAD_URL/linux/$lsb_dist/gpg\" | apt-key add -qq - >/dev/null"
$sh_c "echo \"$apt_repo\" > /etc/apt/sources.list.d/docker.list"
$sh_c 'apt-get update -qq >/dev/null'
)
pkg_version=""
if [ -n "$VERSION" ]; then
if is_dry_run; then
echo "# WARNING: VERSION pinning is not supported in DRY_RUN"
else
# Will work for incomplete versions IE (17.12), but may not actually grab the "latest" if in the test channel
pkg_pattern="$(echo "$VERSION" | sed "s/-ce-/~ce~.*/g" | sed "s/-/.*/g").*-0~$lsb_dist"
search_command="apt-cache madison 'docker-ce' | grep '$pkg_pattern' | head -1 | awk '{\$1=\$1};1' | cut -d' ' -f 3"
pkg_version="$($sh_c "$search_command")"
echo "INFO: Searching repository for VERSION '$VERSION'"
echo "INFO: $search_command"
if [ -z "$pkg_version" ]; then
echo
echo "ERROR: '$VERSION' not found amongst apt-cache madison results"
echo
exit 1
fi
search_command="apt-cache madison 'docker-ce-cli' | grep '$pkg_pattern' | head -1 | awk '{\$1=\$1};1' | cut -d' ' -f 3"
# Don't insert an = for cli_pkg_version, we'll just include it later
cli_pkg_version="$($sh_c "$search_command")"
pkg_version="=$pkg_version"
fi
fi
(
if ! is_dry_run; then
set -x
fi
if [ -n "$cli_pkg_version" ]; then
$sh_c "apt-get install -y -qq --no-install-recommends docker-ce-cli=$cli_pkg_version >/dev/null"
fi
$sh_c "apt-get install -y -qq --no-install-recommends docker-ce$pkg_version >/dev/null"
)
echo_docker_as_nonroot
exit 0
;;
centos | fedora | rhel)
yum_repo="$DOWNLOAD_URL/linux/$lsb_dist/$REPO_FILE"
if ! curl -Ifs "$yum_repo" >/dev/null; then
echo "Error: Unable to curl repository file $yum_repo, is it valid?"
exit 1
fi
if [ "$lsb_dist" = "fedora" ]; then
pkg_manager="dnf"
config_manager="dnf config-manager"
enable_channel_flag="--set-enabled"
disable_channel_flag="--set-disabled"
pre_reqs="dnf-plugins-core"
pkg_suffix="fc$dist_version"
else
pkg_manager="yum"
config_manager="yum-config-manager"
enable_channel_flag="--enable"
disable_channel_flag="--disable"
pre_reqs="yum-utils"
pkg_suffix="el"
fi
(
if ! is_dry_run; then
set -x
fi
$sh_c "$pkg_manager install -y -q $pre_reqs"
$sh_c "$config_manager --add-repo $yum_repo"
if [ "$CHANNEL" != "stable" ]; then
$sh_c "$config_manager $disable_channel_flag docker-ce-*"
$sh_c "$config_manager $enable_channel_flag docker-ce-$CHANNEL"
fi
$sh_c "$pkg_manager makecache"
)
pkg_version=""
if [ -n "$VERSION" ]; then
if is_dry_run; then
echo "# WARNING: VERSION pinning is not supported in DRY_RUN"
else
pkg_pattern="$(echo "$VERSION" | sed "s/-ce-/\\\\.ce.*/g" | sed "s/-/.*/g").*$pkg_suffix"
search_command="$pkg_manager list --showduplicates 'docker-ce' | grep '$pkg_pattern' | tail -1 | awk '{print \$2}'"
pkg_version="$($sh_c "$search_command")"
echo "INFO: Searching repository for VERSION '$VERSION'"
echo "INFO: $search_command"
if [ -z "$pkg_version" ]; then
echo
echo "ERROR: '$VERSION' not found amongst $pkg_manager list results"
echo
exit 1
fi
search_command="$pkg_manager list --showduplicates 'docker-ce-cli' | grep '$pkg_pattern' | tail -1 | awk '{print \$2}'"
# It's okay for cli_pkg_version to be blank, since older versions don't support a cli package
cli_pkg_version="$($sh_c "$search_command" | cut -d':' -f 2)"
# Cut out the epoch and prefix with a '-'
pkg_version="-$(echo "$pkg_version" | cut -d':' -f 2)"
fi
fi
(
if ! is_dry_run; then
set -x
fi
# install the correct cli version first
if [ -n "$cli_pkg_version" ]; then
$sh_c "$pkg_manager install -y -q docker-ce-cli-$cli_pkg_version"
fi
$sh_c "$pkg_manager install -y -q docker-ce$pkg_version"
)
echo_docker_as_nonroot
exit 0
;;
*)
if [ -z "$lsb_dist" ]; then
if is_darwin; then
echo
echo "ERROR: Unsupported operating system 'macOS'"
echo "Please get Docker Desktop from https://www.docker.com/products/docker-desktop"
echo
exit 1
fi
fi
echo
echo "ERROR: Unsupported distribution '$lsb_dist'"
echo
exit 1
;;
esac
exit 1
}
# wrapped up in a function so that we have some protection against only getting
# half the file during "curl | sh"
do_install

@ -0,0 +1,10 @@
#!/bin/bash
curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | \
sudo dd of=/etc/apt/trusted.gpg.d/githubcli-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/trusted.gpg.d/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | \
sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null
sudo apt update
sudo apt install gh

@ -0,0 +1,22 @@
#!/bin/sh
set -e
cd "$(mktemp -d)"
# TODO eventually update this to detect
os=mac
arch=amd64
file=$(curl -sSL "https://golang.org/dl/?mode=json" \
| jq -r '.[0].files[]
| select(.os == "'"$os"'")
| select(.arch == "'"$arch"'")
| .filename')
curl -sSLO \
-H "Accept: application/vnd.github.v3+json" \
"https://dl.google.com/go/$file"
sudo tar xzf "$file" -C /usr/local/
echo "Make sure /usr/local/go/bin is in PATH"

@ -0,0 +1,16 @@
#!/bin/sh
set -e
# If you like packages ...
# curl https://baltocdn.com/helm/signing.asc | sudo apt-key add -
# sudo apt-get install apt-transport-https --yes
# echo "deb https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.li
# st.d/helm-stable-debian.list
# sudo apt-get update
# sudo apt-get install helm
# ... or you can do it directly
cd $(mktemp -d)
curl -fsSL -O https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
#export HELM_INSTALL_DIR="${HOME}/.local/bin"
bash ./get-helm-3

@ -0,0 +1,7 @@
#!/bin/sh
set -e
latest="https://api.github.com/repos/sharkdp/hyperfine/releases/latest"
ver=$(curl -sS "$latest" | jq -r .zipball_url) && test -n "$ver"
ver=${ver##*/} && deb="hyperfine_${ver#v}_amd64.deb"
url="https://github.com/sharkdp/hyperfine/releases/download/$ver/$deb"
curl -sSLO "$url" && dpkg -i ./*.deb

@ -0,0 +1,4 @@
#!/usr/bin/bash
exec go install sigs.k8s.io/kind@latest

@ -0,0 +1,5 @@
#!/usr/bin/bash
target="$GOBIN/kompose"
#exec go install github.com/kubernetes/kompose@latest
curl -sSL https://github.com/kubernetes/kompose/releases/download/v1.26.1/kompose-linux-amd64 -o "$target"
chmod +x "$target"

@ -0,0 +1,7 @@
#!/bin/sh
set -e
V=$(curl -L -s https://dl.k8s.io/release/stable.txt)
curl -sSLO "https://dl.k8s.io/release/${V}/bin/linux/amd64/kubectl"
curl -sSLO "https://dl.k8s.io/${V}/bin/linux/amd64/kubectl.sha256"
echo "$(head -1 kubectl.sha256) kubectl" | sha256sum --check
cp kubectl /usr/bin && chmod +x /usr/bin/kubectl

@ -0,0 +1,30 @@
#!/bin/bash
set -e
obs=$(command -v obs)
[[ -z "$obs" ]] && echo "OBS not found" && exit 1
ver=$($obs -V)
[[ $ver =~ ([0-9]+)\.([0-9]+)\.([0-9]+) ]]
major=${BASH_REMATCH[1]}
minor=${BASH_REMATCH[2]}
patch=${BASH_REMATCH[3]}
url="https://api.github.com/repos/ratwithacompiler/OBS-captions-plugin/releases/latest"
if (( major < 27 )); then
url="https://api.github.com/repos/ratwithacompiler/OBS-captions-plugin/releases/tags/v0.18b"
fi
dir=$(mktemp -d)
cd "$dir"
echo "Working directory now $dir"
curl -sSL "$url" -o release.json
name=$(jq -r .name release.json)
url=$(jq -r '.assets[].browser_download_url' release.json | grep Linux)
echo "Attempting to download $name from $url"
curl -LO "$url"
unzip *.zip
mv *Linux/libobs_google_caption_plugin "$HOME/.config/obs-studio/plugins"
rm -rf "$dir"

@ -0,0 +1,9 @@
#!/bin/sh
set -e
loc=$(curl -o /dev/null -sIw "%{redirect_url}" \
'https://github.com/jgm/pandoc/releases/latest')
vers=${loc##*/}
deb="pandoc-$vers-1-amd64.deb"
uri=${loc%/tag*}/download/$vers/$deb
curl -sL "$uri" -o "/tmp/$deb"
dpkg -i "/tmp/$deb"

@ -0,0 +1,9 @@
#!/bin/bash
# WARNING: this will fuck up your terminal and overwrite stuff, be
# careful
curl https://download.opensuse.org/repositories/isv:/Rancher:/stable/deb/Release.key | sudo apt-key add -
sudo add-apt-repository 'deb https://download.opensuse.org/repositories/isv:/Rancher:/stable/deb/ ./'
sudo apt update
sudo apt install rancher-desktop

@ -0,0 +1,5 @@
#!/bin/bash
dir="$HOME/.local/bin"
mkdir -p "$dir"
curl -L https://github.com/talos-systems/talos/releases/latest/download/talosctl-linux-amd64 -o "$dir"/talosctl
chmod +x "$dir/talosctl"

@ -0,0 +1,12 @@
#!/bin/bash
ver=1.1.3
[[ -z "$GOBIN" ]] && echo "GOBIN not set" && exit 1
dir=$(mktemp -d)
cd "$dir"
echo "Now working from $dir"
curl -sSLO "https://releases.hashicorp.com/terraform/$ver/terraform_${ver}_linux_amd64.zip"
unzip -q *.zip
mv terraform "$GOBIN"

@ -0,0 +1,2 @@
#!/bin/bash
sudo gem install twurl

@ -0,0 +1,18 @@
#!/bin/bash
docker pull vagrantlibvirt/vagrant-libvirt:latest
echo '
Now add the following function to your ~/.bashrc:
vagrant ()
{
docker run -it --rm \
-e LIBVIRT_DEFAULT_URI \
-v /var/run/libvirt/:/var/run/libvirt/ \
-v ~/.vagrant.d:/.vagrant.d \
-v $(realpath "${PWD}"):${PWD} \
-w $(realpath "${PWD}") \
--network host \
vagrantlibvirt/vagrant-libvirt:latest vagrant "$@"
}
'

@ -0,0 +1,6 @@
#!/bin/sh
brew install bash
echo "Now don't forget:"
echo " Add /usr/local/bin/bash to /etc/shells"
echo " Run chsh -s /usr/local/bin/bash"
echo " Use #!/usr/bin/env bash as shebang line"

@ -0,0 +1,2 @@
#!/bin/sh
exec brew install jq

@ -0,0 +1,2 @@
#!/bin/sh
exec brew install lynx

@ -0,0 +1,405 @@
{
"Use Non-ASCII Font" : false,
"Tags" : [
],
"Ansi 12 Color" : {
"Red Component" : 0.51372551918029785,
"Color Space" : "Calibrated",
"Blue Component" : 0.59607845544815063,
"Alpha Component" : 1,
"Green Component" : 0.64705884456634521
},
"Ansi 6 Color" : {
"Red Component" : 0.40784314274787903,
"Color Space" : "Calibrated",
"Blue Component" : 0.41568627953529358,
"Alpha Component" : 1,
"Green Component" : 0.61568629741668701
},
"Draw Powerline Glyphs" : true,
"Bold Color" : {
"Red Component" : 0.90980392694473267,
"Color Space" : "Calibrated",
"Blue Component" : 0.64313727617263794,
"Alpha Component" : 1,
"Green Component" : 0.83137255907058716
},
"Normal Font" : "UbuntuMono-Regular 30",
"Link Color" : {
"Red Component" : 0.7450980544090271,
"Color Space" : "Calibrated",
"Blue Component" : 0.090196080505847931,
"Alpha Component" : 1,
"Green Component" : 0.058823529630899429
},
"Ansi 1 Color" : {
"Red Component" : 0.80000001192092896,
"Color Space" : "Calibrated",
"Blue Component" : 0.11372549086809158,
"Alpha Component" : 1,
"Green Component" : 0.14117647707462311
},
"Rows" : 29,
"Default Bookmark" : "No",
"Ansi 2 Color" : {
"Red Component" : 0.59607845544815063,
"Color Space" : "Calibrated",
"Blue Component" : 0.10196078568696976,
"Alpha Component" : 1,
"Green Component" : 0.59215688705444336
},
"Cursor Guide Color" : {
"Red Component" : 0.64999997615814209,
"Color Space" : "Calibrated",
"Blue Component" : 1,
"Alpha Component" : 0.25,
"Green Component" : 0.9100000262260437
},
"Non-ASCII Anti Aliased" : true,
"Use Bright Bold" : true,
"Ansi 10 Color" : {
"Red Component" : 0.72156864404678345,
"Color Space" : "Calibrated",
"Blue Component" : 0.14901961386203766,
"Alpha Component" : 1,
"Green Component" : 0.73333334922790527
},
"Prevent Opening in a Tab" : true,
"Ambiguous Double Width" : false,
"Jobs to Ignore" : [
"rlogin",
"ssh",
"slogin",
"telnet"
],
"Ansi 15 Color" : {
"Red Component" : 0.92156863212585449,
"Color Space" : "Calibrated",
"Blue Component" : 0.69803923368453979,
"Alpha Component" : 1,
"Green Component" : 0.85882353782653809
},
"Foreground Color" : {
"Red Component" : 0.90980392694473267,
"Color Space" : "Calibrated",
"Blue Component" : 0.64313727617263794,
"Alpha Component" : 1,
"Green Component" : 0.83137255907058716
},
"Working Directory" : "\/Users\/rwxrob",
"Blinking Cursor" : true,
"Disable Window Resizing" : true,
"Sync Title" : false,
"Prompt Before Closing 2" : false,
"BM Growl" : true,
"Command" : "",
"Description" : "Default",
"Mouse Reporting" : true,
"Screen" : -1,
"Selection Color" : {
"Red Component" : 0.19607843458652496,
"Color Space" : "Calibrated",
"Blue Component" : 0.18431372940540314,
"Alpha Component" : 1,
"Green Component" : 0.18823529779911041
},
"Columns" : 107,
"Idle Code" : 0,
"Ansi 13 Color" : {
"Red Component" : 0.82745099067687988,
"Color Space" : "Calibrated",
"Blue Component" : 0.60784316062927246,
"Alpha Component" : 1,
"Green Component" : 0.52549022436141968
},
"Custom Command" : "No",
"ASCII Anti Aliased" : true,
"Non Ascii Font" : "Monaco 12",
"Vertical Spacing" : 1,
"Use Bold Font" : true,
"Option Key Sends" : 0,
"Selected Text Color" : {
"Red Component" : 0.70916998386383057,
"Color Space" : "Calibrated",
"Blue Component" : 0.70916998386383057,
"Alpha Component" : 1,
"Green Component" : 0.70916998386383057
},
"Background Color" : {
"Red Component" : 0.10980392247438431,
"Color Space" : "Calibrated",
"Blue Component" : 0.10980392247438431,
"Alpha Component" : 1,
"Green Component" : 0.10980392247438431
},
"Character Encoding" : 4,
"Ansi 11 Color" : {
"Red Component" : 0.98039215803146362,
"Color Space" : "Calibrated",
"Blue Component" : 0.18431372940540314,
"Alpha Component" : 1,
"Green Component" : 0.74117648601531982
},
"Use Italic Font" : true,
"Unlimited Scrollback" : false,
"Keyboard Map" : {
"0xf700-0x260000" : {
"Action" : 10,
"Text" : "[1;6A"
},
"0x37-0x40000" : {
"Action" : 11,
"Text" : "0x1f"
},
"0x32-0x40000" : {
"Action" : 11,
"Text" : "0x00"
},
"0xf709-0x20000" : {
"Action" : 10,
"Text" : "[17;2~"
},
"0xf70c-0x20000" : {
"Action" : 10,
"Text" : "[20;2~"
},
"0xf729-0x20000" : {
"Action" : 10,
"Text" : "[1;2H"
},
"0xf72b-0x40000" : {
"Action" : 10,
"Text" : "[1;5F"
},
"0xf705-0x20000" : {
"Action" : 10,
"Text" : "[1;2Q"
},
"0xf703-0x260000" : {
"Action" : 10,
"Text" : "[1;6C"
},
"0xf700-0x220000" : {
"Action" : 10,
"Text" : "[1;2A"
},
"0xf701-0x280000" : {
"Action" : 11,
"Text" : "0x1b 0x1b 0x5b 0x42"
},
"0x38-0x40000" : {
"Action" : 11,
"Text" : "0x7f"
},
"0x33-0x40000" : {
"Action" : 11,
"Text" : "0x1b"
},
"0xf703-0x220000" : {
"Action" : 10,
"Text" : "[1;2C"
},
"0xf701-0x240000" : {
"Action" : 10,
"Text" : "[1;5B"
},
"0xf70d-0x20000" : {
"Action" : 10,
"Text" : "[21;2~"
},
"0xf702-0x260000" : {
"Action" : 10,
"Text" : "[1;6D"
},
"0xf729-0x40000" : {
"Action" : 10,
"Text" : "[1;5H"
},
"0xf706-0x20000" : {
"Action" : 10,
"Text" : "[1;2R"
},
"0x34-0x40000" : {
"Action" : 11,
"Text" : "0x1c"
},
"0xf700-0x280000" : {
"Action" : 11,
"Text" : "0x1b 0x1b 0x5b 0x41"
},
"0x2d-0x40000" : {
"Action" : 11,
"Text" : "0x1f"
},
"0xf70e-0x20000" : {
"Action" : 10,
"Text" : "[23;2~"
},
"0xf702-0x220000" : {
"Action" : 10,
"Text" : "[1;2D"
},
"0xf703-0x280000" : {
"Action" : 11,
"Text" : "0x1b 0x1b 0x5b 0x43"
},
"0xf700-0x240000" : {
"Action" : 10,
"Text" : "[1;5A"
},
"0xf707-0x20000" : {
"Action" : 10,
"Text" : "[1;2S"
},
"0xf70a-0x20000" : {
"Action" : 10,
"Text" : "[18;2~"
},
"0x35-0x40000" : {
"Action" : 11,
"Text" : "0x1d"
},
"0xf70f-0x20000" : {
"Action" : 10,
"Text" : "[24;2~"
},
"0xf703-0x240000" : {
"Action" : 10,
"Text" : "[1;5C"
},
"0xf701-0x260000" : {
"Action" : 10,
"Text" : "[1;6B"
},
"0xf702-0x280000" : {
"Action" : 11,
"Text" : "0x1b 0x1b 0x5b 0x44"
},
"0xf72b-0x20000" : {
"Action" : 10,
"Text" : "[1;2F"
},
"0x36-0x40000" : {
"Action" : 11,
"Text" : "0x1e"
},
"0xf708-0x20000" : {
"Action" : 10,
"Text" : "[15;2~"
},
"0xf701-0x220000" : {
"Action" : 10,
"Text" : "[1;2B"
},
"0xf70b-0x20000" : {
"Action" : 10,
"Text" : "[19;2~"
},
"0xf702-0x240000" : {
"Action" : 10,
"Text" : "[1;5D"
},
"0xf704-0x20000" : {
"Action" : 10,
"Text" : "[1;2P"
}
},
"Window Type" : 0,
"Cursor Boost" : 0,
"Background Image Location" : "",
"Blur" : false,
"Badge Color" : {
"Red Component" : 1,
"Color Space" : "Calibrated",
"Blue Component" : 0,
"Alpha Component" : 0.5,
"Green Component" : 0
},
"Scrollback Lines" : 1000,
"Send Code When Idle" : false,
"Close Sessions On End" : true,
"Terminal Type" : "xterm-256color",
"Visual Bell" : true,
"Flashing Bell" : false,
"Silence Bell" : true,
"Ansi 14 Color" : {
"Red Component" : 0.55686277151107788,
"Color Space" : "Calibrated",
"Blue Component" : 0.48627451062202454,
"Alpha Component" : 1,
"Green Component" : 0.78823530673980713
},
"ASCII Ligatures" : false,
"Name" : "Default",
"Cursor Text Color" : {
"Red Component" : 0.90980392694473267,
"Color Space" : "Calibrated",
"Blue Component" : 0.64313727617263794,
"Alpha Component" : 1,
"Green Component" : 0.83137255907058716
},
"Minimum Contrast" : 0.30243267276422764,
"Shortcut" : "",
"Cursor Color" : {
"Red Component" : 0.82086181640625,
"Color Space" : "sRGB",
"Blue Component" : 0.25787205621600151,
"Alpha Component" : 1,
"Green Component" : 0.57852262672474808
},
"Transparency" : 0,
"Ansi 0 Color" : {
"Red Component" : 0.15686275064945221,
"Color Space" : "Calibrated",
"Blue Component" : 0.15686275064945221,
"Alpha Component" : 1,
"Green Component" : 0.15686275064945221
},
"Custom Directory" : "No",
"Ansi 3 Color" : {
"Red Component" : 0.84313726425170898,
"Color Space" : "Calibrated",
"Blue Component" : 0.12941177189350128,
"Alpha Component" : 1,
"Green Component" : 0.60000002384185791
},
"Guid" : "A45A9A72-F134-43CD-8E35-C3C946457F5D",
"Right Option Key Sends" : 0,
"Horizontal Spacing" : 1,
"Ansi 7 Color" : {
"Red Component" : 0.65882354974746704,
"Color Space" : "Calibrated",
"Blue Component" : 0.51764708757400513,
"Alpha Component" : 1,
"Green Component" : 0.60000002384185791
},
"Ansi 8 Color" : {
"Red Component" : 0.57254904508590698,
"Color Space" : "Calibrated",
"Blue Component" : 0.45490196347236633,
"Alpha Component" : 1,
"Green Component" : 0.51372551918029785
},
"Ansi 9 Color" : {
"Red Component" : 0.9843137264251709,
"Color Space" : "Calibrated",
"Blue Component" : 0.20392157137393951,
"Alpha Component" : 1,
"Green Component" : 0.28627452254295349
},
"Ansi 4 Color" : {
"Red Component" : 0.27058824896812439,
"Color Space" : "Calibrated",
"Blue Component" : 0.53333336114883423,
"Alpha Component" : 1,
"Green Component" : 0.5215686559677124
},
"Ansi 5 Color" : {
"Red Component" : 0.69411766529083252,
"Color Space" : "Calibrated",
"Blue Component" : 0.52549022436141968,
"Alpha Component" : 1,
"Green Component" : 0.38431373238563538
}
}

@ -0,0 +1,321 @@
{
"$schema": "https://aka.ms/terminal-profiles-schema",
"actions":
[
{
"command":
{
"action": "copy",
"singleLine": false
},
"keys": "ctrl+c"
},
{
"command": "paste",
"keys": "ctrl+v"
},
{
"command": "find",
"keys": "ctrl+shift+f"
},
{
"command":
{
"action": "splitPane",
"split": "auto",
"splitMode": "duplicate"
},
"keys": "alt+shift+d"
}
],
"alwaysShowTabs": true,
"copyFormatting": "none",
"copyOnSelect": true,
"defaultProfile": "{07b52e3e-de2c-5db4-bd2d-ba144ed6c273}",
"disableAnimations": true,
"initialCols": 80,
"launchMode": "default",
"profiles":
{
"defaults": {},
"list":
[
{
"commandline": "powershell.exe",
"guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
"hidden": false,
"name": "Windows PowerShell"
},
{
"bellStyle": "none",
"closeOnExit": "always",
"colorScheme": "Gruvbox",
"commandline": "C:\\Program Files\\Git\\bin\\bash.exe",
"fontFace": "UbuntuMono NF",
"fontSize": 21,
"guid": "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}",
"hidden": false,
"name": "Git-Bash",
"padding": "4",
"scrollbarState": "hidden"
},
{
"guid": "{b453ae62-4e3d-5e58-b989-0a998ec441b8}",
"hidden": false,
"name": "Azure Cloud Shell",
"source": "Windows.Terminal.Azure"
},
{
"bellStyle": "none",
"closeOnExit": "always",
"colorScheme": "Gruvbox",
"fontFace": "UbuntuMono NF",
"fontSize": 21,
"guid": "{07b52e3e-de2c-5db4-bd2d-ba144ed6c273}",
"hidden": false,
"name": "Ubuntu-20.04",
"padding": "5",
"scrollbarState": "hidden",
"source": "Windows.Terminal.Wsl",
"startingDirectory": "%USERPROFILE%"
}
]
},
"schemes":
[
{
"background": "#0C0C0C",
"black": "#0C0C0C",
"blue": "#0037DA",
"brightBlack": "#767676",
"brightBlue": "#3B78FF",
"brightCyan": "#61D6D6",
"brightGreen": "#16C60C",
"brightPurple": "#B4009E",
"brightRed": "#E74856",
"brightWhite": "#F2F2F2",
"brightYellow": "#F9F1A5",
"cursorColor": "#FFFFFF",
"cyan": "#3A96DD",
"foreground": "#CCCCCC",
"green": "#13A10E",
"name": "Campbell",
"purple": "#881798",
"red": "#C50F1F",
"selectionBackground": "#FFFFFF",
"white": "#CCCCCC",
"yellow": "#C19C00"
},
{
"background": "#012456",
"black": "#0C0C0C",
"blue": "#0037DA",
"brightBlack": "#767676",
"brightBlue": "#3B78FF",
"brightCyan": "#61D6D6",
"brightGreen": "#16C60C",
"brightPurple": "#B4009E",
"brightRed": "#E74856",
"brightWhite": "#F2F2F2",
"brightYellow": "#F9F1A5",
"cursorColor": "#FFFFFF",
"cyan": "#3A96DD",
"foreground": "#CCCCCC",
"green": "#13A10E",
"name": "Campbell Powershell",
"purple": "#881798",
"red": "#C50F1F",
"selectionBackground": "#FFFFFF",
"white": "#CCCCCC",
"yellow": "#C19C00"
},
{
"background": "#282828",
"black": "#504945",
"blue": "#458588",
"brightBlack": "#928374",
"brightBlue": "#83A598",
"brightCyan": "#8EC07C",
"brightGreen": "#B8BB26",
"brightPurple": "#D3869B",
"brightRed": "#FB4934",
"brightWhite": "#EBDBB2",
"brightYellow": "#FABD2F",
"cursorColor": "#EBDBB2",
"cyan": "#689D6A",
"foreground": "#EBDBB2",
"green": "#98971A",
"name": "Gruvbox",
"purple": "#B16286",
"red": "#CC241D",
"selectionBackground": "#32FFF6",
"white": "#A89984",
"yellow": "#D79921"
},
{
"background": "#282C34",
"black": "#282C34",
"blue": "#61AFEF",
"brightBlack": "#5A6374",
"brightBlue": "#61AFEF",
"brightCyan": "#56B6C2",
"brightGreen": "#98C379",
"brightPurple": "#C678DD",
"brightRed": "#E06C75",
"brightWhite": "#DCDFE4",
"brightYellow": "#E5C07B",
"cursorColor": "#FFFFFF",
"cyan": "#56B6C2",
"foreground": "#DCDFE4",
"green": "#98C379",
"name": "One Half Dark",
"purple": "#C678DD",
"red": "#E06C75",
"selectionBackground": "#FFFFFF",
"white": "#DCDFE4",
"yellow": "#E5C07B"
},
{
"background": "#FAFAFA",
"black": "#383A42",
"blue": "#0184BC",
"brightBlack": "#4F525D",
"brightBlue": "#61AFEF",
"brightCyan": "#56B5C1",
"brightGreen": "#98C379",
"brightPurple": "#C577DD",
"brightRed": "#DF6C75",
"brightWhite": "#FFFFFF",
"brightYellow": "#E4C07A",
"cursorColor": "#4F525D",
"cyan": "#0997B3",
"foreground": "#383A42",
"green": "#50A14F",
"name": "One Half Light",
"purple": "#A626A4",
"red": "#E45649",
"selectionBackground": "#FFFFFF",
"white": "#FAFAFA",
"yellow": "#C18301"
},
{
"background": "#002B36",
"black": "#002B36",
"blue": "#268BD2",
"brightBlack": "#073642",
"brightBlue": "#839496",
"brightCyan": "#93A1A1",
"brightGreen": "#586E75",
"brightPurple": "#6C71C4",
"brightRed": "#CB4B16",
"brightWhite": "#FDF6E3",
"brightYellow": "#657B83",
"cursorColor": "#FFFFFF",
"cyan": "#2AA198",
"foreground": "#839496",
"green": "#859900",
"name": "Solarized Dark",
"purple": "#D33682",
"red": "#DC322F",
"selectionBackground": "#FFFFFF",
"white": "#EEE8D5",
"yellow": "#B58900"
},
{
"background": "#FDF6E3",
"black": "#002B36",
"blue": "#268BD2",
"brightBlack": "#073642",
"brightBlue": "#839496",
"brightCyan": "#93A1A1",
"brightGreen": "#586E75",
"brightPurple": "#6C71C4",
"brightRed": "#CB4B16",
"brightWhite": "#FDF6E3",
"brightYellow": "#657B83",
"cursorColor": "#002B36",
"cyan": "#2AA198",
"foreground": "#657B83",
"green": "#859900",
"name": "Solarized Light",
"purple": "#D33682",
"red": "#DC322F",
"selectionBackground": "#FFFFFF",
"white": "#EEE8D5",
"yellow": "#B58900"
},
{
"background": "#000000",
"black": "#000000",
"blue": "#3465A4",
"brightBlack": "#555753",
"brightBlue": "#729FCF",
"brightCyan": "#34E2E2",
"brightGreen": "#8AE234",
"brightPurple": "#AD7FA8",
"brightRed": "#EF2929",
"brightWhite": "#EEEEEC",
"brightYellow": "#FCE94F",
"cursorColor": "#FFFFFF",
"cyan": "#06989A",
"foreground": "#D3D7CF",
"green": "#4E9A06",
"name": "Tango Dark",
"purple": "#75507B",
"red": "#CC0000",
"selectionBackground": "#FFFFFF",
"white": "#D3D7CF",
"yellow": "#C4A000"
},
{
"background": "#FFFFFF",
"black": "#000000",
"blue": "#3465A4",
"brightBlack": "#555753",
"brightBlue": "#729FCF",
"brightCyan": "#34E2E2",
"brightGreen": "#8AE234",
"brightPurple": "#AD7FA8",
"brightRed": "#EF2929",
"brightWhite": "#EEEEEC",
"brightYellow": "#FCE94F",
"cursorColor": "#000000",
"cyan": "#06989A",
"foreground": "#555753",
"green": "#4E9A06",
"name": "Tango Light",
"purple": "#75507B",
"red": "#CC0000",
"selectionBackground": "#FFFFFF",
"white": "#D3D7CF",
"yellow": "#C4A000"
},
{
"background": "#000000",
"black": "#000000",
"blue": "#000080",
"brightBlack": "#808080",
"brightBlue": "#0000FF",
"brightCyan": "#00FFFF",
"brightGreen": "#00FF00",
"brightPurple": "#FF00FF",
"brightRed": "#FF0000",
"brightWhite": "#FFFFFF",
"brightYellow": "#FFFF00",
"cursorColor": "#FFFFFF",
"cyan": "#008080",
"foreground": "#C0C0C0",
"green": "#008000",
"name": "Vintage",
"purple": "#800080",
"red": "#800000",
"selectionBackground": "#FFFFFF",
"white": "#C0C0C0",
"yellow": "#808000"
}
],
"showTabsInTitlebar": true,
"showTerminalTitleInTitlebar": false,
"startOnUserLogin": true,
"theme": "dark"
}

@ -0,0 +1,19 @@
# Lynx Text Browser FTW!
*New and Improved! You can now test this as a [container]:*
```
docker run -it --rm rwxrob/lynx
```
It might be the oldest web browser currently under active maintenance
but it is still hands down the single best browser for rapid research.
Lynx does not even look at the bloat of images, CSS, and JavaScript when
loading making it objectively the fastest possible way to browse the
text of web sites. When combined with a `?` (`duck`) and `??` (`google`)
command you fill find results to documentation queries and technical
documentation as fast as it takes to open a local `man` page.
## Install
Run the `./setup` to

File diff suppressed because it is too large Load Diff

@ -0,0 +1,116 @@
# Setting the normal and default types lets us keep (almost) the same colors
# whether the terminal's default colors are white-on-black or black-on-white.
# It is not exact since the default "white" is not necessarily the same color
# as the ANSI lightgray, but is as close as we can get in a standard way.
#
# If you really want the terminal's default colors, and if lynx is built using
# ncurses' default-color support, remove these two lines:
#normal: normal: lightgray:black
#default: normal: white:black
# Normal type styles correspond to HTML tags.
#
# The next line (beginning with "em") means: use bold if mono, otherwise
# brightblue on <defaultbackground>
em: bold: brightblue
strong: bold: brightred
b: bold: red
i: bold: brightblue
a: bold: green
img: dim: brown
fig: normal: gray
caption: reverse: brown
hr: normal: yellow
blockquote: normal: brightblue
ul: normal: brown
address: normal: magenta
title: normal: magenta
tt: dim: brightmagenta: black
h1: bold: white: blue
label: normal: magenta
q: normal: yellow: magenta
small: dim: default
big: bold: yellow
sup: bold: yellow
sub: dim: gray
li: normal: magenta
code: normal: cyan
cite: normal: cyan
table: normal: brightcyan
tr: bold: brown
td: normal: default
br: normal: default
# Special styles - not corresponding directly to HTML tags
# alert - status bar, when message begins "Alert".
# alink - active link
# normal - default attributes
# status - status bar
# whereis - whereis search target
#
#normal:normal:default:blue
alink: reverse: yellow: black
status: reverse: cyan: default
alert: bold: yellow: red
#whereis: reverse+underline: magenta: cyan
whereis: bold+reverse: black: yellow
# currently not used
#value:normal:green
menu.bg: normal: black: lightgray
menu.frame: normal: black: lightgray
menu.entry: normal: lightgray: black
menu.n: normal: red: gray
menu.active: normal: yellow: black
menu.sb: normal: brightred: lightgray
forwbackw.arrow:reverse
hot.paste: normal: brightred: gray
# Styles with classes - <ul class=red> etc.
ul.red: underline: brightred
ul.blue: bold: brightblue
li.red: reverse: red: yellow
li.blue: bold: blue
strong.a: bold: black: red
em.a: reverse: black: blue
strong.b: bold: white: red
em.b: reverse: white: blue
strong.debug: reverse: green
font.letter: normal: white: blue
input.submit: normal: cyan
tr.baone: bold: yellow
tr.batwo: bold: green
tr.bathree: bold: red
#
# Special handling for link.
link: normal: white
link.green: bold: brightgreen
link.red: bold: black: red
link.blue: bold: white: blue
link.toc: bold: black: white
# Special cases for link - the rel or title is appended after the class.
# <link rel=next class=red href="1">
link.red.next: bold: red
link.red.prev: bold: yellow: red
link.blue.prev: bold: yellow: blue
link.blue.next: bold: blue
link.green.toc: bold: white: green
#
# Define styles that will be used when syntax highlighting is requested
# (commandline option -prettysrc).
span.htmlsrc_comment:normal: white
span.htmlsrc_tag:normal: white
#If you don't like that the tag name and attribute name are displayed
#in different colors, comment the following line.
span.htmlsrc_attrib:normal: cyan
span.htmlsrc_attrval:normal: magenta
span.htmlsrc_abracket:normal: white
span.htmlsrc_entity:normal: white
##span.htmlsrc_href:
##span.htmlsrc_entire:
span.htmlsrc_badseq:normal: red
span.htmlsrc_badtag:normal: red
span.htmlsrc_badattr:normal: red
span.htmlsrc_sgmlspecial:normal: yellow

@ -0,0 +1,12 @@
#!/bin/sh
# WARNING: This setup requires a custom form of lynx (a shell script in
# scripts) be installed as well as lynx. [For an easier text browsing
# experience that works out of the box use w3m instead.]
# Also have a look at https://github.com/rwxrob/lynx for more.
mkdir ~/.config/ 2>/dev/null
rm -rf ~/.config/lynx 2>/dev/null
ln -s "$PWD" "$HOME/.config/lynx"
ls -l ~/.config/lynx

@ -0,0 +1,3 @@
# Podman Completion
Add `d` to the `complete` line at the end.

File diff suppressed because it is too large Load Diff

@ -0,0 +1,3 @@
#!/bin/sh
mkdir -p ~/.local/share/podman
ln -fs "$PWD/completion" ~/.local/share/podman/completion

@ -0,0 +1,4 @@
#!/usr/bin/env bash
for i in {0..255}; do
printf "\e[38;5;${i}m$i "
done

@ -0,0 +1,33 @@
# Scripts
Pilfer at your own peril. You'll find a bit of everything, but mostly
just bash and perl. If that's not your thing, dont waste your time —
especially if you use `zsh-it` for anything. If you have questions, come
ask me on <https://rwxrob.tv>.
More substantial commands have their own repos prefixed with [`cmd-`]
derived [`template-bash-command`]. Other commands (like the popular
[`pomo`] tool) are compiled go utilities with repos prefixed with
[`cmdbox-`].
[`template-bash-command`]: <https://github.com/rwxrob/template-bash-command>
[`cmdbox-`]: <https://github.com/search?q=user%3Arwxrob+cmdbox->
[`cmd-`]: <https://github.com/search?q=user%3Arwxrob+cmd->
[`pomo`]: <https://github.com/rwxrob/cmdbox-pomo>
## Installation
> ⚠️
> If you don't understand what any script is doing and how, then don't
> install it, period. You have been warned.
Best way to use these scripts is to *read them*, grab them and put them
into your own stuff. ***For personal scripts only***, I've given in and
started using the incredibly inefficient and insecure `/usr/bin/env`
she-bang line convention, which pretty much ensures they will work on most any OS and distro.
## Legal
Copyright 2021 Rob Muhlestein <rob@rwx.gg>
Released under Apache-1.0 License
Please mention <https://rwxrob.tv>

@ -0,0 +1,632 @@
#!/bin/bash
#
# Knowledge Management Utility
#
# Please maintain the style as described in Google's Shell Style Guide
#
# Copyright © 2020 Robert Sterling Muhlestein.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, version 2.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#######################################
# Assumes modern terminal with RGB.
declare NOCOLOR=
[[ -t 1 ]] || NOCOLOR=y
declare GOLD=$'\033[38;2;184;138;0m'
declare RED=$'\033[38;2;255;0;0m'
declare GREY=$'\033[38;2;100;100;100m'
declare CYAN=$'\033[38;2;0;255;255m'
declare GREEN=$'\033[38;2;0;255;0m'
declare RESET=$'\033[0m'
if [[ -n "$NOCOLOR" ]] ; then
GOLD=
RED=
GREY=
CYAN=
GREEN=
RESET=
fi
#######################################
# Validate that a current knowledge node has been declared as KN
# environment variable.
if [[ -z "${KN}" ]]; then
echo "${RED}Please set \$KN to current knowledge node path."
exit 1
fi
#######################################
# Each command must have an accompanying function that begins with an
# underscore to which the main command will delgate.
readonly -a COMMANDS=(
usage render build preview previewstop mkmanifest checkone audit find
title rss logdir logpath datepath logroot recdir
)
#######################################
# Print the first argument as a colored message and exit with
# error status.
#
# Globals:
# RED
# Arguments:
# Message to print
# Outputs:
# Red message text
# Returns:
# Always returns 1
_fail () {
echo "${RED}$1${RESET}" >&2
exit 1
}
#######################################
# Returns true if first argument is the name of a command in the PATH.
#
# Arguments:
# Message to print.
_have () {
which "$1" &>/dev/null
}
#######################################
# Returns true if process is currently running.
#
# Arguments:
# Process ID number.
_proc () {
kill -0 "$1" 2>/dev/null
}
#######################################
# Skip through a timestamped MANIFEST file to the first matching line
# and continue to output the name/IDs of the lines beginning with that
# line until the end of the file. Will look for a file in
# current directory named MANIFEST if one is not passed as the second
# argument. The format of the file is a float that is seconds since
# epoch (potentially with nanoseconds) followed by whitespace and then
# the name/ID of a knowledge node (directory):
#
# 1591796821.3353818530 boosts/logistics
#
# Arguments:
# Exact string to match a line in the file.
# Path to the file to skip through.
_skipto () {
local there
local match="$1"
local file="${2:-MANIFEST}"
if [[ -z "${match}" ]]; then
read -r changed line <<< $(head -1 ${file})
echo ${line}
return
fi
while read -r changed line; do
[[ "${match}" == "${line}" ]] && there=y
[[ "${there}" != y ]] && continue
echo "${line}"
done < "${file}"
}
#######################################
# Allows the reading of all combined arguments into a string buffer that
# is then echoed, or if no arguments are detected reads fully from
# standard input until there is none left and echoes that. This is
# notable because it allows the usage of heredoc input instead of
# arguments making for much cleaner blocks of text. [Ex: declare
# id=$(_argsorin $*)]
#
# Arguments:
# All are combined into string.
_argsorin () {
local buf="$*" line IFS
if [[ -n "${buf}" ]]; then
echo "${buf}"
return
fi
read line
buf="${line}"
while IFS= read line; do
buf="${buf}\n${line}"
done
echo "${buf}"
}
#######################################
# Create a MANIFEST file in the root of the knowledge base that contains
# the knowledge node identifiers (relative paths) and the last modified
# time in seconds since Unix epoch (first). Anything beginning with
# underscore (_) will be ignored. The MANIFEST file is the only file
# required by subscribers to identify if anything has changed in the
# knowledge base since the last time it was the subscriber cached it
# locally. The root node of the knowledge base is a single dot.
#
# Arguments:
# Path to the manifest file. MANIFEST by default.
_mkmanifest () {
declare line IFS file="${1:-MANIFEST}"
while IFS= read -r line; do
line=${line#/}
line=${line/.\//}
[[ -z "${line}" ]] && continue
echo "${line}"
done <<< $(
find . ! -path '*/_*' -a \
-name 'README.md' \
-printf "%T@ %h\n" \
| sort -d) > "${file}"
}
#######################################
# Output the full path to the current log file for the current day (by
# default). Normal `date` command adjustments can be added as extra
# arguments as they are passed directly to `date -d`.
_logpath () {
local dir=$(_logdir "$*")
echo "${dir}/README.md"
}
#######################################
# Output the full path to the current log dir for the current day (by
# default). Normal `date` command adjustments can be added as extra
# arguments as they are passed directly to `date -d`.
_logdir () {
local relpath=$(_datepath "$*")
echo "${KN}/log/${relpath}"
}
#######################################
# Output the full path to the current log rec dir for the current day
# (by default). This is where video and audio recordings YAML documents
# should normally be kept (but not where the actual audio and
# video files should be saved due to size). Normal `date` command
# adjustments can be added as extra arguments as they are passed
# directly to `date -d`.
_recdir () {
local dir=$(_logdir "$*")
echo "${dir}/rec"
}
#######################################
# Outputs the full path to the root log directory for the current
# knowledge node.
_logroot () {
echo "${KN}/log"
}
#######################################
# Output the current date as a path for use when creating content within
# a directory file structure that models chronological data. Accepts
# anything that can be passed to `date -d`.
_datepath () {
date +%4Y/%m/%d "-d $@"
}
#######################################
# Call the pandoc command to render a single node passed as the
# first and only argument. The HTML index.html output is created in the
# same knowledge node subdirectory. A single dot (.) can be passed to
# render the root node of the knowledge base.
#
# Globals:
# README
# RED
# CYAN
# RESET
# Arguments:
# Node ID
# Outputs:
# Prints colored error output from Pandoc
#
# TODO allow more pandoc arguments to be passed from configuration
_render () {
local error style
local node="${1%/README.md}"
local template='--template=main'
local in="${node}/README.md"
local hi='--no-highlight'
local out="--output=${node}/index.html"
local ddir="${README}/assets"
[[ ! -e "${in}" ]] && _fail "Could not find ${CYAN} '${in}'"
[[ -e "${README}/global.yml" ]] && gdata="global.yml"
[[ -e "${node}/styles.css" ]] && style="--metadata=xstyles:styles.css"
[[ -e "${node}/template.html" ]] && template="--template=${node}/template.html"
error=$(pandoc -s -M title=_ ${nosyn} --data-dir=${ddir} ${hi} ${out} \
${template} ${style} ${gdata} ${in} 2>&1)
[[ -n "${error}" ]] && echo ${CYAN}${node}:${RED} ${error}${RESET} >&2
}
#######################################
# Makes the manifest again and renders all the nodes of the knowledge
# base asyncronously. No effort is made to stagger the rendering of nodes
# into any sort of workgroup since rendering a single node is very fast
# and most operating systems can easily handle concurrent rendering of
# every existing node.
#
# Globals:
# GREY
# RESET
# Arguments:
# None
# Outputs:
# Prints colored summary of number of nodes rendered and speed.
_build () {
local begin end
local -a pids
local -i count
begin=$(date +%s)
_mkmanifest
_render '.'
while read -r change node; do
_render "${node}" &
count+=1
done < ./MANIFEST
wait
end=$(date +%s)
_rss
echo "${GRAY}Rendered ${count} nodes in $((end-begin)) seconds.${RESET}"
}
#######################################
# Checks a single node for broken links and such. Depends on `muffet`
# being installed.
#
# Globals:
# GREEN
# RESET
# Arguments:
# Node name/ID
# Outputs:
# Prints colored 'No broken URLs detected.' if passing
# Prints any error output from muffet if failing
# TODO:
# Read target node as second argument or from config
_checkone () {
_have muffet || _fail 'Install https://github.com/raviqqe/muffet'
[[ -e .previewpid ]] || _fail "Doesn't look like preview is running (no .previewpid)."
declare node="http://localhost:3001/$1"
muffet \
--one-page-only "${node}" \
--exclude 'https://duck.com' \
--exclude 'https://duckduckgo.com' \
--exclude 'https://www.lifewire' \
--exclude 'http://linuxcommand' \
--exclude 'https://vimgenius.com'
if [[ $? != 0 ]]; then
return 1
fi
echo " ${GREEN}No Broken URLs detected.${RESET}"
}
#######################################
# Slowly checks one node at a time from the MANIFEST keeping track of
# each as it goes. This is useful for interactively correcting
# potentially dozens of broken links. To reset to the beginning simple
# remove the .lastchecked file.
#
# Globals:
# GREY
# RESET
# Arguments:
# None
# Outputs:
# Prints 'Checking <node>' and the output of checknode for each
_audit () {
# see _checkone for dependency validations
local last node
if [[ ! -e .lastchecked ]]; then
local line=$(head -1 MANIFEST)
node=${line#* }
echo $node > .lastchecked
return
fi
read -r last < .lastchecked
while read -r node; do
echo "${GREY}Checking ${node}${RESET}"
_checkone "${node}"
local rval=$?
echo "${node}" >| .lastchecked
if [[ ${rval} != 0 ]]; then
return 1
fi
done <<< $(_skipto "${last}")
}
#######################################
# Runs the amazing browser-sync live site previewing utility
# putting it into the background and writing the PID to .previewpid.
# The preview can later be disabled with previewstop. Preview has to
# be running for the check* COMMANDS to work.
#
# Globals:
# GREY
# GREEN
# CYAN
# RESET
# Arguments:
# None
# Outputs:
# Error output if not browser-sync
# Returns:
# Fails if no browser-sync detected on the system
# Success if browser-sync started
_preview () {
_have browser-sync || _fail 'Need to install browser-sync.'
declare pid=$(head -1 .previewpid 2>/dev/null)
if [[ -n "${pid}" ]]; then
if _proc "${pid}"; then
_fail "Already previewing."
else
rm .previewid 2>/dev/null
fi
fi
browser-sync start \
--no-notify --no-ui \
--ignore '**/.*' \
-sw &>/dev/null &
pid=$!
echo "${pid}" >| .previewpid
echo "${GREEN}Previewing with ${CYAN}browser-sync ${GREY}(${pid})${RESET}"
}
#######################################
# Stops the pid contained .previewpid if found.
#
# Globals:
# GREY
# GREEN
# RESET
# Arguments:
# None
# Outputs:
# Error messages on failure
# "Previewing stopped ..." on success
# Returns:
# Failure (1) if nothing being previewed
# Success (0) if preview running and stopped.
_previewstop () {
declare pid=$(head -1 .previewpid 2>/dev/null)
[[ -z "${pid}" ]] && _fail "Don't appear to be previewing (no preview PID found)."
kill "${pid}" && rm .previewpid
echo "${GREEN}Previewing stopped ${GREY}(killed ${pid} and removed .previewpid)${RESET}"
}
#######################################
# Searches the MANIFEST for a matching substring passed as the first and
# only parameter and prints the resulting full node identifiers with the
# substring highlighted in green. Also searches the _redirects list
# for possible shortcuts and other former identifiers
#
# Globals:
# GREY
# GREEN
# RESET
# Arguments:
# Substring to look for.
# Outputs:
# Prints the node names/IDs of matches.
# Prints errors if nothing to find.
# Returns:
# Failure (1) if nothing to find.
# Success (0) if either something found or not found.
# TODO:
# Replace with other find that matches based on header and tag
# hits with priority and puts the top 20 in a select list
_find () {
declare substr="$1"
[[ -z "$1" ]] && _fail 'Nothing to find.'
while read -r changed name; do
[[ -z "${name}" ]] && continue
echo "${GREY}$(_url)/${name%%${substr}*}${GREEN}${substr}${GREY}${name##*${substr}}"
done <<< $(grep "${substr}" MANIFEST)
while read -r redirect; do
[[ -z "${name}" ]] && continue
echo "${GREY}$(_url)/${redirect%%${substr}*}${GREEN}${substr}${GREY}${redirect##*${substr}}"
done <<< $(grep "${substr}" _redirects)
}
#######################################
# Returns the URL YAML field from the main README.md file.
_url () {
local line=$(grep ^URL: README.md)
echo ${line#URL:}
}
#######################################
# Returns the Short YAML field from the main README.md file.
_short () {
local line=$(grep ^Short: README.md)
echo ${line#Short:}
}
#######################################
# Returns the Description YAML field from the main README.md file.
_description () {
local line=$(grep ^Description: README.md)
echo ${line#Description:}
}
#######################################
# Returns the copyright YAML field from the main README.md file.
_copyright () {
local line=$(grep ^Copyright: README.md)
echo ${line#Copyright:}
}
#######################################
# Parses out the Title from the specified node and prints it.
#
# Globals:
# GREEN
# RESET
# Arguments:
# Node name/ID
# Outputs:
# Prints the title of the given node in color.
_title () {
declare -a nodes
if [[ -n "$1" ]]; then
nodes="$@"
else
while IFS= read -r line; do
nodes+=(${line})
done
fi
for node in ${nodes[@]}; do
while read -r line; do
if [[ "$line" =~ ^Title:\ ]]; then
echo "${GREEN}${line:7}${RESET}"
fi
done < "${node}/README.md" 2>/dev/null
done
}
#######################################
# Creates an RSS feed if the node is a log.
_rss () {
declare dir=${1:-.}
declare file="${dir}"/README.md
egrep '^## +(Mon|Tue|Wed|Thu|Fri|Sat|Sun)' "${file}" &>/dev/null
if [[ $? == 0 ]]; then
# TODO make all of this only add if detected
echo '<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<atom:link href="'$(_url)'/rss.xml" rel="self" type="application/rss+xml" />
<title>'$(_short)'</title>
<link>'$(_url)'</link>
<description>'$(_description)'</description>
<copyright>'$(_copyright)'</copyright>' > "${dir}"/rss.xml
declare -i item=0
buf=""
while read line; do
if [[ "${line}" =~ ^##\ +(Mon|Tue|Wed|Thu|Fri|Sat|Sun) ]]; then
if [[ $item > 0 ]]; then
echo "${buf}" |perl -pe 's,\[(.+)\](.*),\1,;s,(<|>),,g;s,&,&amp;,g' >> "${dir}"/rss.xml
echo '</description></item>' >> "${dir}"/rss.xml
buf=""
fi
item=$((item+1))
echo '<item>' >> "${dir}"/rss.xml
#guid=${line#\#\# *}
#guid=${guid// }
#TODO user relative link creator for URI
echo '<title>'${line#\#\# *}'</title>' >> "${dir}"/rss.xml
#echo '<guid>'$guid'</guid>' >> "${dir}"/rss.xml
echo '<description>' >> "${dir}"/rss.xml
continue
fi
if [[ "${line}" == "" ]]; then
continue
fi
buf="$buf $line"
done < <(egrep '^## +(Mon|Tue|Wed|Thu|Fri|Sat|Sun)' -A 5 "${file}")
echo "${buf}" |perl -pe 's,\[(.+)\](.*),\1,;s,(<|>),,g;s,&,&amp;,g' >> "${dir}"/rss.xml
echo '</description></item>' >> "${dir}"/rss.xml
echo '</channel></rss>' >> "${dir}"/rss.xml
return 0
else
echo ${RED}Not a log file.${RESET}
return 1
fi
}
#######################################
# Prints each of the command names and exits.
_usage () {
echo "${GREY}usage: ${GOLD}kn ${CYAN}<cmd>${RESET}"
for i in ${COMMANDS[@]}; do echo " ${CYAN}$i"; done
}
#######################################
# Checks if command is being used in tab completion context (`complete -C
# kn kn` and COMP_LINE set). If so handle completion and exit.
# Otherwise, assume execution context. Detect the README working
# directory since more than one README knowledge base may exist on
# a single system. Look for full COMMAND matches for the first argument.
# Then accept the first matching substring as the command to use. Then
# delegate.
main () {
local c cmd="${1-usage}"
shift 2>/dev/null
# knowledge base detection
#[[ -d .git && -e README.md ]] && export README="${PWD}"
[[ -e README.md ]] && export README="${PWD}"
[[ -z "${README}" ]] && _fail "Need to set README environment variable"
cd "${README}" || _fail "Could not change into README directory: ${README}"
# tab completion
if [[ -n "$COMP_LINE" ]]; then
for c in ${COMMANDS[@]}; do
[[ "${c:0:${#1}}" == "$1" ]] && echo "${c}"
done
exit 0
fi
# full command match
for c in ${COMMANDS[@]}; do
if [[ "${c}" == "${cmd}" ]]; then
"_${c}" "$@"
exit 0
fi
done
# partial command match
for c in ${COMMANDS[@]}; do
if [[ "${c}" =~ ^${cmd} ]]; then
"_${c}" "$@"
exit 0
fi
done
}
# NORUN allows this file to be sourced while checking for syntax errors
# and unit testing specific functions.
[[ -z "${NORUN}" ]] && main "$@"

@ -0,0 +1,42 @@
#!/bin/bash
declare subcommand="$1"; shift
declare -r gold=$'\033[38;2;250;130;10m'
declare -r cyan=$'\033[38;2;0;255;255m'
declare -r reset=$'\033[0m'
ziplink () {
if [[ -z "$1" ]]; then
echo "usage: gh ziplink <account>/<repo>"
fi
curl -s "https://api.github.com/repos/$1/releases/latest" |jq -r .zipball_url
}
zipball () {
if [[ -z "$1" ]]; then
echo "usage: gh zipball <account>/<repo>"
fi
declare link=$(ziplink "$1")
declare file=${1##*/}.${link##*/}.zip
echo "${gold}Downloading ${cyan}$link$reset -> ${cyan}$file$reset"
curl -s -L "$link" -o "$file"
}
declare -a commands=(ziplink zipball)
for i in ${commands[@]}; do
if [[ $i == "$subcommand" ]]; then
"$subcommand" $*
exit 0
fi
done
######################### Tab Completion Context ########################
# remember COMP_LINE is changed by shift
if [ -n "$COMP_LINE" ]; then
for cmd in ${commands[@]}; do
[[ "${cmd:0:${#1}}" == "$1" ]] && echo $cmd
done
exit 0
fi

@ -0,0 +1,633 @@
#!/bin/bash
#
# README.World Knowledge Management Utility
#
# Please maintain the style as described in Google's Shell Style Guide
# <https://google.github.io/styleguide/shellguide.html>
#
# Copyright © 2020 Robert Sterling Muhlestein.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, version 2.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#######################################
# Assumes modern terminal with RGB.
declare NOCOLOR=
[[ -t 1 ]] || NOCOLOR=y
declare GOLD=$'\033[38;2;184;138;0m'
declare RED=$'\033[38;2;255;0;0m'
declare GREY=$'\033[38;2;100;100;100m'
declare CYAN=$'\033[38;2;0;255;255m'
declare GREEN=$'\033[38;2;0;255;0m'
declare RESET=$'\033[0m'
if [[ -n "$NOCOLOR" ]] ; then
GOLD=
RED=
GREY=
CYAN=
GREEN=
RESET=
fi
#######################################
# Validate that a current knowledge node has been declared as KN
# environment variable.
if [[ -z "${KN}" ]]; then
echo "${RED}Please set \$KN to current knowledge node path."
exit 1
fi
#######################################
# Each command must have an accompanying function that begins with an
# underscore to which the main command will delgate.
readonly -a COMMANDS=(
usage render build preview previewstop mkmanifest checkone audit find
title rss logdir logpath datepath logroot recdir
)
#######################################
# Print the first argument as a colored message and exit with
# error status.
#
# Globals:
# RED
# Arguments:
# Message to print
# Outputs:
# Red message text
# Returns:
# Always returns 1
_fail () {
echo "${RED}$1${RESET}" >&2
exit 1
}
#######################################
# Returns true if first argument is the name of a command in the PATH.
#
# Arguments:
# Message to print.
_have () {
which "$1" &>/dev/null
}
#######################################
# Returns true if process is currently running.
#
# Arguments:
# Process ID number.
_proc () {
kill -0 "$1" 2>/dev/null
}
#######################################
# Skip through a timestamped MANIFEST file to the first matching line
# and continue to output the name/IDs of the lines beginning with that
# line until the end of the file. Will look for a file in
# current directory named MANIFEST if one is not passed as the second
# argument. The format of the file is a float that is seconds since
# epoch (potentially with nanoseconds) followed by whitespace and then
# the name/ID of a knowledge node (directory):
#
# 1591796821.3353818530 boosts/logistics
#
# Arguments:
# Exact string to match a line in the file.
# Path to the file to skip through.
_skipto () {
local there
local match="$1"
local file="${2:-MANIFEST}"
if [[ -z "${match}" ]]; then
read -r changed line <<< $(head -1 ${file})
echo ${line}
return
fi
while read -r changed line; do
[[ "${match}" == "${line}" ]] && there=y
[[ "${there}" != y ]] && continue
echo "${line}"
done < "${file}"
}
#######################################
# Allows the reading of all combined arguments into a string buffer that
# is then echoed, or if no arguments are detected reads fully from
# standard input until there is none left and echoes that. This is
# notable because it allows the usage of heredoc input instead of
# arguments making for much cleaner blocks of text. [Ex: declare
# id=$(_argsorin $*)]
#
# Arguments:
# All are combined into string.
_argsorin () {
local buf="$*" line IFS
if [[ -n "${buf}" ]]; then
echo "${buf}"
return
fi
read line
buf="${line}"
while IFS= read line; do
buf="${buf}\n${line}"
done
echo "${buf}"
}
#######################################
# Create a MANIFEST file in the root of the knowledge base that contains
# the knowledge node identifiers (relative paths) and the last modified
# time in seconds since Unix epoch (first). Anything beginning with
# underscore (_) will be ignored. The MANIFEST file is the only file
# required by subscribers to identify if anything has changed in the
# knowledge base since the last time it was the subscriber cached it
# locally. The root node of the knowledge base is a single dot.
#
# Arguments:
# Path to the manifest file. MANIFEST by default.
_mkmanifest () {
declare line IFS file="${1:-MANIFEST}"
while IFS= read -r line; do
line=${line#/}
line=${line/.\//}
[[ -z "${line}" ]] && continue
echo "${line}"
done <<< $(
find . ! -path '*/_*' -a \
-name 'README.md' \
-printf "%T@ %h\n" \
| sort -d) > "${file}"
}
#######################################
# Output the full path to the current log file for the current day (by
# default). Normal `date` command adjustments can be added as extra
# arguments as they are passed directly to `date -d`.
_logpath () {
local dir=$(_logdir "$*")
echo "${dir}/README.md"
}
#######################################
# Output the full path to the current log dir for the current day (by
# default). Normal `date` command adjustments can be added as extra
# arguments as they are passed directly to `date -d`.
_logdir () {
local relpath=$(_datepath "$*")
echo "${KN}/log/${relpath}"
}
#######################################
# Output the full path to the current log rec dir for the current day
# (by default). This is where video and audio recordings YAML documents
# should normally be kept (but not where the actual audio and
# video files should be saved due to size). Normal `date` command
# adjustments can be added as extra arguments as they are passed
# directly to `date -d`.
_recdir () {
local dir=$(_logdir "$*")
echo "${dir}/rec"
}
#######################################
# Outputs the full path to the root log directory for the current
# knowledge node.
_logroot () {
echo "${KN}/log"
}
#######################################
# Output the current date as a path for use when creating content within
# a directory file structure that models chronological data. Accepts
# anything that can be passed to `date -d`.
_datepath () {
date +%4Y/%m/%d "-d $@"
}
#######################################
# Call the pandoc command to render a single node passed as the
# first and only argument. The HTML index.html output is created in the
# same knowledge node subdirectory. A single dot (.) can be passed to
# render the root node of the knowledge base.
#
# Globals:
# README
# RED
# CYAN
# RESET
# Arguments:
# Node ID
# Outputs:
# Prints colored error output from Pandoc
#
# TODO allow more pandoc arguments to be passed from configuration
_render () {
local error style
local node="${1%/README.md}"
local template='--template=main'
local in="${node}/README.md"
local hi='--no-highlight'
local out="--output=${node}/index.html"
local ddir="${README}/assets"
[[ ! -e "${in}" ]] && _fail "Could not find ${CYAN} '${in}'"
[[ -e "${README}/global.yml" ]] && gdata="global.yml"
[[ -e "${node}/styles.css" ]] && style="--metadata=xstyles:styles.css"
[[ -e "${node}/template.html" ]] && template="--template=${node}/template.html"
error=$(pandoc -s -M title=_ ${nosyn} --data-dir=${ddir} ${hi} ${out} \
${template} ${style} ${gdata} ${in} 2>&1)
[[ -n "${error}" ]] && echo ${CYAN}${node}:${RED} ${error}${RESET} >&2
}
#######################################
# Makes the manifest again and renders all the nodes of the knowledge
# base asyncronously. No effort is made to stagger the rendering of nodes
# into any sort of workgroup since rendering a single node is very fast
# and most operating systems can easily handle concurrent rendering of
# every existing node.
#
# Globals:
# GREY
# RESET
# Arguments:
# None
# Outputs:
# Prints colored summary of number of nodes rendered and speed.
_build () {
local begin end
local -a pids
local -i count
begin=$(date +%s)
_mkmanifest
_render '.'
while read -r change node; do
_render "${node}" &
count+=1
done < ./MANIFEST
wait
end=$(date +%s)
_rss
echo "${GRAY}Rendered ${count} nodes in $((end-begin)) seconds.${RESET}"
}
#######################################
# Checks a single node for broken links and such. Depends on `muffet`
# being installed.
#
# Globals:
# GREEN
# RESET
# Arguments:
# Node name/ID
# Outputs:
# Prints colored 'No broken URLs detected.' if passing
# Prints any error output from muffet if failing
# TODO:
# Read target node as second argument or from config
_checkone () {
_have muffet || _fail 'Install https://github.com/raviqqe/muffet'
[[ -e .previewpid ]] || _fail "Doesn't look like preview is running (no .previewpid)."
declare node="http://localhost:3001/$1"
muffet \
--one-page-only "${node}" \
--exclude 'https://duck.com' \
--exclude 'https://duckduckgo.com' \
--exclude 'https://www.lifewire' \
--exclude 'http://linuxcommand' \
--exclude 'https://vimgenius.com'
if [[ $? != 0 ]]; then
return 1
fi
echo " ${GREEN}No Broken URLs detected.${RESET}"
}
#######################################
# Slowly checks one node at a time from the MANIFEST keeping track of
# each as it goes. This is useful for interactively correcting
# potentially dozens of broken links. To reset to the beginning simple
# remove the .lastchecked file.
#
# Globals:
# GREY
# RESET
# Arguments:
# None
# Outputs:
# Prints 'Checking <node>' and the output of checknode for each
_audit () {
# see _checkone for dependency validations
local last node
if [[ ! -e .lastchecked ]]; then
local line=$(head -1 MANIFEST)
node=${line#* }
echo $node > .lastchecked
return
fi
read -r last < .lastchecked
while read -r node; do
echo "${GREY}Checking ${node}${RESET}"
_checkone "${node}"
local rval=$?
echo "${node}" >| .lastchecked
if [[ ${rval} != 0 ]]; then
return 1
fi
done <<< $(_skipto "${last}")
}
#######################################
# Runs the amazing browser-sync live site previewing utility
# putting it into the background and writing the PID to .previewpid.
# The preview can later be disabled with previewstop. Preview has to
# be running for the check* COMMANDS to work.
#
# Globals:
# GREY
# GREEN
# CYAN
# RESET
# Arguments:
# None
# Outputs:
# Error output if not browser-sync
# Returns:
# Fails if no browser-sync detected on the system
# Success if browser-sync started
_preview () {
_have browser-sync || _fail 'Need to install browser-sync.'
declare pid=$(head -1 .previewpid 2>/dev/null)
if [[ -n "${pid}" ]]; then
if _proc "${pid}"; then
_fail "Already previewing."
else
rm .previewid 2>/dev/null
fi
fi
browser-sync start \
--no-notify --no-ui \
--ignore '**/.*' \
-sw &>/dev/null &
pid=$!
echo "${pid}" >| .previewpid
echo "${GREEN}Previewing with ${CYAN}browser-sync ${GREY}(${pid})${RESET}"
}
#######################################
# Stops the pid contained .previewpid if found.
#
# Globals:
# GREY
# GREEN
# RESET
# Arguments:
# None
# Outputs:
# Error messages on failure
# "Previewing stopped ..." on success
# Returns:
# Failure (1) if nothing being previewed
# Success (0) if preview running and stopped.
_previewstop () {
declare pid=$(head -1 .previewpid 2>/dev/null)
[[ -z "${pid}" ]] && _fail "Don't appear to be previewing (no preview PID found)."
kill "${pid}" && rm .previewpid
echo "${GREEN}Previewing stopped ${GREY}(killed ${pid} and removed .previewpid)${RESET}"
}
#######################################
# Searches the MANIFEST for a matching substring passed as the first and
# only parameter and prints the resulting full node identifiers with the
# substring highlighted in green. Also searches the _redirects list
# for possible shortcuts and other former identifiers
#
# Globals:
# GREY
# GREEN
# RESET
# Arguments:
# Substring to look for.
# Outputs:
# Prints the node names/IDs of matches.
# Prints errors if nothing to find.
# Returns:
# Failure (1) if nothing to find.
# Success (0) if either something found or not found.
# TODO:
# Replace with other find that matches based on header and tag
# hits with priority and puts the top 20 in a select list
_find () {
declare substr="$1"
[[ -z "$1" ]] && _fail 'Nothing to find.'
while read -r changed name; do
[[ -z "${name}" ]] && continue
echo "${GREY}$(_url)/${name%%${substr}*}${GREEN}${substr}${GREY}${name##*${substr}}"
done <<< $(grep "${substr}" MANIFEST)
while read -r redirect; do
[[ -z "${name}" ]] && continue
echo "${GREY}$(_url)/${redirect%%${substr}*}${GREEN}${substr}${GREY}${redirect##*${substr}}"
done <<< $(grep "${substr}" _redirects)
}
#######################################
# Returns the URL YAML field from the main README.md file.
_url () {
local line=$(grep ^URL: README.md)
echo ${line#URL:}
}
#######################################
# Returns the Short YAML field from the main README.md file.
_short () {
local line=$(grep ^Short: README.md)
echo ${line#Short:}
}
#######################################
# Returns the Description YAML field from the main README.md file.
_description () {
local line=$(grep ^Description: README.md)
echo ${line#Description:}
}
#######################################
# Returns the copyright YAML field from the main README.md file.
_copyright () {
local line=$(grep ^Copyright: README.md)
echo ${line#Copyright:}
}
#######################################
# Parses out the Title from the specified node and prints it.
#
# Globals:
# GREEN
# RESET
# Arguments:
# Node name/ID
# Outputs:
# Prints the title of the given node in color.
_title () {
declare -a nodes
if [[ -n "$1" ]]; then
nodes="$@"
else
while IFS= read -r line; do
nodes+=(${line})
done
fi
for node in ${nodes[@]}; do
while read -r line; do
if [[ "$line" =~ ^Title:\ ]]; then
echo "${GREEN}${line:7}${RESET}"
fi
done < "${node}/README.md" 2>/dev/null
done
}
#######################################
# Creates an RSS feed if the node is a log.
_rss () {
declare dir=${1:-.}
declare file="${dir}"/README.md
egrep '^## +(Mon|Tue|Wed|Thu|Fri|Sat|Sun)' "${file}" &>/dev/null
if [[ $? == 0 ]]; then
# TODO make all of this only add if detected
echo '<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<atom:link href="'$(_url)'/rss.xml" rel="self" type="application/rss+xml" />
<title>'$(_short)'</title>
<link>'$(_url)'</link>
<description>'$(_description)'</description>
<copyright>'$(_copyright)'</copyright>' > "${dir}"/rss.xml
declare -i item=0
buf=""
while read line; do
if [[ "${line}" =~ ^##\ +(Mon|Tue|Wed|Thu|Fri|Sat|Sun) ]]; then
if [[ $item > 0 ]]; then
echo "${buf}" |perl -pe 's,\[(.+)\](.*),\1,;s,(<|>),,g;s,&,&amp;,g' >> "${dir}"/rss.xml
echo '</description></item>' >> "${dir}"/rss.xml
buf=""
fi
item=$((item+1))
echo '<item>' >> "${dir}"/rss.xml
#guid=${line#\#\# *}
#guid=${guid// }
#TODO user relative link creator for URI
echo '<title>'${line#\#\# *}'</title>' >> "${dir}"/rss.xml
#echo '<guid>'$guid'</guid>' >> "${dir}"/rss.xml
echo '<description>' >> "${dir}"/rss.xml
continue
fi
if [[ "${line}" == "" ]]; then
continue
fi
buf="$buf $line"
done < <(egrep '^## +(Mon|Tue|Wed|Thu|Fri|Sat|Sun)' -A 5 "${file}")
echo "${buf}" |perl -pe 's,\[(.+)\](.*),\1,;s,(<|>),,g;s,&,&amp;,g' >> "${dir}"/rss.xml
echo '</description></item>' >> "${dir}"/rss.xml
echo '</channel></rss>' >> "${dir}"/rss.xml
return 0
else
echo ${RED}Not a log file.${RESET}
return 1
fi
}
#######################################
# Prints each of the command names and exits.
_usage () {
echo "${GREY}usage: ${GOLD}kn ${CYAN}<cmd>${RESET}"
for i in ${COMMANDS[@]}; do echo " ${CYAN}$i"; done
}
#######################################
# Checks if command is being used in tab completion context (`complete -C
# kn kn` and COMP_LINE set). If so handle completion and exit.
# Otherwise, assume execution context. Detect the README working
# directory since more than one README knowledge base may exist on
# a single system. Look for full COMMAND matches for the first argument.
# Then accept the first matching substring as the command to use. Then
# delegate.
main () {
local c cmd="${1-usage}"
shift 2>/dev/null
# knowledge base detection
#[[ -d .git && -e README.md ]] && export README="${PWD}"
[[ -e README.md ]] && export README="${PWD}"
[[ -z "${README}" ]] && _fail "Need to set README environment variable"
cd "${README}" || _fail "Could not change into README directory: ${README}"
# tab completion
if [[ -n "$COMP_LINE" ]]; then
for c in ${COMMANDS[@]}; do
[[ "${c:0:${#1}}" == "$1" ]] && echo "${c}"
done
exit 0
fi
# full command match
for c in ${COMMANDS[@]}; do
if [[ "${c}" == "${cmd}" ]]; then
"_${c}" "$@"
exit 0
fi
done
# partial command match
for c in ${COMMANDS[@]}; do
if [[ "${c}" =~ ^${cmd} ]]; then
"_${c}" "$@"
exit 0
fi
done
}
# NORUN allows this file to be sourced while checking for syntax errors
# and unit testing specific functions.
[[ -z "${NORUN}" ]] && main "$@"

@ -0,0 +1,33 @@
#!/bin/bash
# Opens the default log file with vim. Accepts the
# standard `date` offset. Prompts to commit.
relpath=$(datepath "$*")
dir="${KN}/log/$relpath"
file="$dir/README.md"
mkdir -p "${dir}"
# prepend a timestamped heading
tmpfile=$(mktemp)
hnow "$*" >"${tmpfile}"
echo -e "\n\n" >>"${tmpfile}"
if [ -e "${file}" ]; then
cat "${file}" >>"${tmpfile}"
fi
mv "${tmpfile}" "${file}"
echo "${file}"
vim +3 "${file}"
read -p 'Do you want to commit? ' commit
if [[ ! $commit =~ ^[Yy] ]]; then
exit
fi
cd "${dir}"
git add "${file}"
git commit
#git push

@ -0,0 +1,2 @@
#!/bin/sh
exec git add "$@"

@ -0,0 +1,15 @@
#!/usr/bin/env bash
# Outputs the seconds since the thing identified by the first argument
# was last modified (not created).
ageof() {
local path="$1"
if [[ -z "$path" ]]; then
echo 'usage: ageof <path>'
return 1
fi
echo $(( $(date +%s) - $(date -r "$path" +%s) ))
}
ageof "$@"

@ -0,0 +1,7 @@
#!/bin/sh
for font in /usr/share/figlet/*.flf; do
clear
echo "FONT: $font"
figlet -f "${font}" hello
read line
done

@ -0,0 +1,2 @@
#!/bin/sh
exec git commit --amend "$@"

@ -0,0 +1,2 @@
#!/usr/bin/env bash
exec chat "!ar $1 $2"

@ -0,0 +1,10 @@
#!/bin/sh
exec tmux \
splitw -h \;\
send fishies ENTER \;\
selectp -t 1 \;\
splitw \;\
send tmatrix ENTER \;\
selectp -t 1 \;\
send watchcow ENTER \;\
resizep -t 2 -y 5 -x 44

@ -0,0 +1,2 @@
#!/bin/sh
exec ./build "$@"

@ -0,0 +1,9 @@
#!/usr/bin/env bash
what="$*"
if [[ -z "${what}" ]]; then
what="in a bit"
elif [[ $what =~ ^([0-9]+) ]]; then
what="at $(date -d "${BASH_REMATCH[1]} minutes" +%-I:%M)"
fi
echo "$what" > ~/.break
exec bannerfish "back $what"

@ -0,0 +1,16 @@
#!/bin/sh
# Uses Weechat to ban a target on Twitch.
if [ -z "$TWITCH_USER" ]; then
echo '$TWITCH_USER environment variable not set.'
exit 1
fi
if [ -z "$1" -o -z "$2" ]; then
echo 'usage: ban <twitchid> <reason>'
exit 1
fi
wee "/msg $TWITCH_USER /ban $1 $2"

@ -0,0 +1,3 @@
#!/bin/sh
#exec w3m https://overthewire.org/wargames/bandit/bandit$1.html
exec lynx https://overthewire.org/wargames/bandit/bandit$1.html

@ -0,0 +1,19 @@
#!/usr/bin/env bash
clear=$'\033[2J'
top=$'\033[H'
trap "setterm --cursor on; echo ${clear}; exit; trap -- - SIGINT SIGTERM" SIGTERM SIGINT
what="$*"
if [ -z "${what}" ]; then
read -p "Text: " what
fi
echo "${clear}"
while true; do
echo "${top}"
figl <<<"$what" | lolcat
setterm --cursor off
sleep 2
done

@ -0,0 +1,8 @@
#!/usr/bin/env bash
what="$*"
if [ -z "${what}" ]; then
read -p "Text: " what
fi
cols=$(tput lines)
pomo stop
tmux split-window \; resize-pane -y $((cols-6)) \; send -t 1 "banner \"$what\"" Enter \; send -t 2 "fishies" Enter

@ -0,0 +1,70 @@
#!/usr/bin/env bash
# Courtesy of @bvierra and company (long ago, pre-cPanel)
### Customization:
blue="\033[0;34m"
brightblue="\033[1;34m"
cyan="\033[0;36m"
brightcyan="\033[1;36m"
green="\033[0;32m"
brightgreen="\033[1;32m"
red="\033[0;31m"
brightred="\033[1;31m"
white="\033[1;37m"
black="\033[0;30m"
grey="\033[0;37m"
darkgrey="\033[1;30m"
# Choose the colors that will be used from the above list
# space-separated list
# e.g. `colors=($green $brightgreen $darkgrey $white)`
colors=($green $brightgreen)
### End customization
### Do not edit below this line
spacing=${1:-100} # the likelihood of a character being left in place
scroll=${2:-0} # 0 for static, positive integer determines scroll speed
screenlines=$(expr `tput lines` - 1 + $scroll)
screencols=$(expr `tput cols` / 2 - 1)
# chars=(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 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 0 1 2 3 4 5 6 7 8 9 ^)
# charset via Carl:
chars=(ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ テ ト ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ ミ ム メ モ ヤ ユ ヨ ラ リ ル レ ロ ワ ン)
count=${#chars[@]}
colorcount=${#colors[@]}
trap "tput sgr0; clear; exit" SIGTERM SIGINT
if [[ $1 =~ '-h' ]]; then
echo "Display a Matrix(ish) screen in the terminal"
echo "Usage: matrix [SPACING [SCROLL]]"
echo "Example: matrix 100 0"
exit 0
fi
clear
tput cup 0 0
while :
do for i in $(eval echo {1..$screenlines})
do for i in $(eval echo {1..$screencols})
do rand=$(($RANDOM%$spacing))
case $rand in
0)
printf "${colors[$RANDOM%$colorcount]}${chars[$RANDOM%$count]} "
;;
1)
printf " "
;;
*)
printf "\033[2C"
;;
esac
done
printf "\n"
# sleep .005
done
tput cup 0 0
done

@ -0,0 +1,3 @@
#!/usr/bin/perl
print grep {/state|to\ full|percentage/}
`upower -i /org/freedesktop/UPower/devices/battery_BAT0`;

@ -0,0 +1,5 @@
#!/bin/sh
url="https://www.bing.com/search?q=$(urlencode "$*")"
chat "$url"
exec lynx "www.bing.com/search?q=$url"

@ -0,0 +1,7 @@
#!/bin/sh
hidecursor
while true; do
clear
sleep 10
done

@ -0,0 +1,14 @@
#!/usr/bin/env bash
year="$1"
firstday=$(date "+%A, %B %e, %Y" -d "May 4 $year")
firstweekday=$(date "+%u" -d "May 4 $year")
daystilsat=$((6-firstweekday))
sat=$(date "+%A, %B %e, %Y" -d "May 4 $year + $daystilsat days")
echo "$firstday"
for i in {0..16}; do
echo "$sat"
sat="$(date "+%A, %B %e, %Y" -d "$sat + 7 days")"
done

@ -0,0 +1,5 @@
#!/bin/sh
if [ -z "$1" ]; then
exec git branch --show-current
fi
exec git checkout -b "$@"

@ -0,0 +1,2 @@
#!/bin/sh
exec git branch "$@"

@ -0,0 +1,2 @@
#!/bin/sh
exec ./build "$@"

@ -0,0 +1,3 @@
#!/bin/sh
exec pae '$_=join " • ", @F'

@ -0,0 +1,2 @@
#!/bin/sh
exec ncal -C -3

@ -0,0 +1,2 @@
#!/usr/bin/env bash
zet edit 20220112151926

@ -0,0 +1,2 @@
#!/usr/bin/env bash
exec zet cast.start "$@"

@ -0,0 +1,2 @@
#!/bin/sh
exec cat $(which "$1")

@ -0,0 +1,2 @@
#!/bin/sh
cat $(which "$1")

@ -0,0 +1,2 @@
#!/usr/bin/env bash
echo -e "${CDPATH//:/\\n}"

@ -0,0 +1,19 @@
#!/usr/bin/env bash
## Returns the full path to any changed files in the current directory
## or any subdirectories recursively one to a line. Useful for detecting
## changes and taking action (see onchange).
changed () {
local dir="${PWD}"
local tmpname="onchange${dir//\//-}"
local tmp="/tmp/${tmpname}"
if [[ ! -e "${tmp}" ]]; then
find "${dir}" -type f -not -path '*testdata*'
else
find "${dir}" -newer "${tmp}" -type f -not -path '*testdata*'
fi
touch "${tmp}"
}
changed "$@"

@ -0,0 +1,15 @@
#!/bin/sh
buf="$*"
if test -n "$buf"; then
#echo "*$buf" >$WEECHAT_FIFO
tmux -L live send -t 2 "$buf" Enter
exit
fi
IFS=
while read -r line; do
#echo "*$line" >$WEECHAT_FIFO
tmux -L live send -t 2 "$line" Enter
done

@ -0,0 +1,13 @@
#!/bin/sh
cheat() {
where="$1"
if [ $# -ge 1 ]; then
shift
fi
IFS=+ curl -sS "http://cht.sh/$where/ $*"
}
cheat "$@"

@ -0,0 +1,26 @@
#!/usr/bin/env bash
declare target="$1"
declare red=$'\033[38;2;255;0;0m'
declare grey=$'\033[38;2;100;100;100m'
declare green=$'\033[38;2;0;255;0m'
declare x=$'\033[0m'
if [[ -z "$(which muffet)" ]]; then
echo "${red}Requires ${grey}https://github.com/raviqqe/muffet ${red}be installed.${x}"
exit 1
fi
if [[ -z "$target" ]]; then
echo "usage: checkurls <pageurl>"
exit 1
fi
if [[ ${1:0:4} != http ]]; then
target="http://$1"
fi
muffet --one-page-only "$target"
if [[ $? -eq 0 ]];then
echo "${green}No Broken URLs detected.${x}"
fi

@ -0,0 +1,29 @@
#!/usr/bin/env bash
# Changes the suffixes from the first argument to the second argument for
# all files specified after that as arguments. Use globstar expansion to
# recurse.
chsuffix ()
{
declare i
declare from="$1"
shift
declare to="$1"
shift
declare files=("$@")
if [[ -z "$files" ]]; then
usageln 'chsuffix <from> <to> <file> ...'
return 1
fi
for i in "${files[@]}"
do
if [[ "$i" =~ $from$ ]]; then
declare stripped=${i%$from}
telln "Moving $i"'` -> `'"$stripped$to"
mv "$i" "$stripped$to"
fi
done
}
chsuffix $*

@ -0,0 +1,2 @@
#!/bin/sh
exec wee /buffer clear

@ -0,0 +1,2 @@
#!/bin/sh
exec gh issue close "$@"

@ -0,0 +1,12 @@
#!/usr/bin/env bash
# Seriously, why do people fuck around with other editor-specific ways
# of commenting things. You don't need no fucking "visual" mode. Vi
# already *is* visual mode (of ex). So tired of people extending Vim to
# improve it without even knowing how to use Vi in the first place. If
# you don't know how to integrate the shell, you don't know Vi. Learn it
# *before* you "extend" it.
while IFS= read -r line; do
echo "${1:-#} $line"
done

@ -0,0 +1,100 @@
#!/usr/bin/env bash
# This file was originally taken from iterm2 https://github.com/gnachman/iTerm2/blob/master/tests/24-bit-color.sh
#
# This file echoes a bunch of 24-bit color codes
# to the terminal to demonstrate its functionality.
# The foreground escape sequence is ^[38;2;<r>;<g>;<b>m
# The background escape sequence is ^[48;2;<r>;<g>;<b>m
# <r> <g> <b> range from 0 to 255 inclusive.
# The escape sequence ^[0m returns output to default
setBackgroundColor()
{
#printf '\x1bPtmux;\x1b\x1b[48;2;%s;%s;%sm' $1 $2 $3
printf '\x1b[48;2;%s;%s;%sm' $1 $2 $3
}
resetOutput()
{
echo -en "\x1b[0m\n"
}
# Gives a color $1/255 % along HSV
# Who knows what happens when $1 is outside 0-255
# Echoes "$red $green $blue" where
# $red $green and $blue are integers
# ranging between 0 and 255 inclusive
rainbowColor()
{
let h=$1/43
let f=$1-43*$h
let t=$f*255/43
let q=255-t
if [ $h -eq 0 ]
then
echo "255 $t 0"
elif [ $h -eq 1 ]
then
echo "$q 255 0"
elif [ $h -eq 2 ]
then
echo "0 255 $t"
elif [ $h -eq 3 ]
then
echo "0 $q 255"
elif [ $h -eq 4 ]
then
echo "$t 0 255"
elif [ $h -eq 5 ]
then
echo "255 0 $q"
else
# execution should never reach here
echo "0 0 0"
fi
}
for i in `seq 0 127`; do
setBackgroundColor $i 0 0
echo -en " "
done
resetOutput
for i in `seq 255 -1 128`; do
setBackgroundColor $i 0 0
echo -en " "
done
resetOutput
for i in `seq 0 127`; do
setBackgroundColor 0 $i 0
echo -n " "
done
resetOutput
for i in `seq 255 -1 128`; do
setBackgroundColor 0 $i 0
echo -n " "
done
resetOutput
for i in `seq 0 127`; do
setBackgroundColor 0 0 $i
echo -n " "
done
resetOutput
for i in `seq 255 -1 128`; do
setBackgroundColor 0 0 $i
echo -n " "
done
resetOutput
for i in `seq 0 127`; do
setBackgroundColor `rainbowColor $i`
echo -n " "
done
resetOutput
for i in `seq 255 -1 128`; do
setBackgroundColor `rainbowColor $i`
echo -n " "
done
resetOutput

@ -0,0 +1,5 @@
#!/usr/bin/env bash
while IFS= read -r line;do
key=${line%%=*}
echo "x.$key() { x.config $key \"\$@\"; }"
done

@ -0,0 +1,2 @@
#!/bin/sh
exec gh issue comment "$@"

@ -0,0 +1,2 @@
#!/bin/sh
exec git commit "$@"

@ -0,0 +1,10 @@
#!/usr/bin/env bash
confirm () {
declare yn
read -p " [y/N] " yn
[[ ${yn,,} =~ y(es)? ]] && return 0
return 1
}
confirm

@ -0,0 +1,2 @@
#!/usr/bin/env bash
exec k config get-contexts

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save