vault backup: 2026-05-15 16:58:51
This commit is contained in:
Vendored
+3
-1
@@ -24,5 +24,7 @@
|
|||||||
"pdf-plus",
|
"pdf-plus",
|
||||||
"copy-document-as-html",
|
"copy-document-as-html",
|
||||||
"templater-obsidian",
|
"templater-obsidian",
|
||||||
"obsidian-toggle-list"
|
"obsidian-toggle-list",
|
||||||
|
"neighbouring-files",
|
||||||
|
"cmdr"
|
||||||
]
|
]
|
||||||
Vendored
+27
-10
@@ -42,15 +42,6 @@
|
|||||||
"key": "S"
|
"key": "S"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"obsidian-linter:lint-all-files": [
|
|
||||||
{
|
|
||||||
"modifiers": [
|
|
||||||
"Mod",
|
|
||||||
"Shift"
|
|
||||||
],
|
|
||||||
"key": "S"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"copy-as-html:copy-as-html-command": [
|
"copy-as-html:copy-as-html-command": [
|
||||||
{
|
{
|
||||||
"modifiers": [
|
"modifiers": [
|
||||||
@@ -93,5 +84,31 @@
|
|||||||
],
|
],
|
||||||
"key": "X"
|
"key": "X"
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"graph:open": [],
|
||||||
|
"graph:open-local": [
|
||||||
|
{
|
||||||
|
"modifiers": [
|
||||||
|
"Mod"
|
||||||
|
],
|
||||||
|
"key": "G"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"neighbouring-files:prev-alphabetical": [
|
||||||
|
{
|
||||||
|
"modifiers": [
|
||||||
|
"Mod"
|
||||||
|
],
|
||||||
|
"key": "K"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"neighbouring-files:next-alphabetical": [
|
||||||
|
{
|
||||||
|
"modifiers": [
|
||||||
|
"Mod"
|
||||||
|
],
|
||||||
|
"key": "J"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"editor:insert-link": []
|
||||||
}
|
}
|
||||||
Vendored
+51
@@ -0,0 +1,51 @@
|
|||||||
|
{
|
||||||
|
"confirmDeletion": false,
|
||||||
|
"showAddCommand": true,
|
||||||
|
"debug": false,
|
||||||
|
"editorMenu": [],
|
||||||
|
"fileMenu": [],
|
||||||
|
"leftRibbon": [],
|
||||||
|
"rightRibbon": [],
|
||||||
|
"titleBar": [],
|
||||||
|
"statusBar": [],
|
||||||
|
"pageHeader": [
|
||||||
|
{
|
||||||
|
"id": "neighbouring-files:prev-alphabetical",
|
||||||
|
"icon": "lucide-file-up",
|
||||||
|
"name": "Neighbouring Files: Navigate to prev file (alphabetical)",
|
||||||
|
"mode": "any"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "neighbouring-files:next-alphabetical",
|
||||||
|
"icon": "lucide-file-down",
|
||||||
|
"name": "Neighbouring Files: Navigate to next file (alphabetical)",
|
||||||
|
"mode": "any"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"macros": [],
|
||||||
|
"explorer": [],
|
||||||
|
"hide": {
|
||||||
|
"statusbar": [
|
||||||
|
"properties",
|
||||||
|
"backlink"
|
||||||
|
],
|
||||||
|
"leftRibbon": [
|
||||||
|
"Digital Garden Publication Center",
|
||||||
|
"Open Git source control",
|
||||||
|
"New drawing",
|
||||||
|
"Advanced Tables Toolbar",
|
||||||
|
"Create new base"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"spacing": "8",
|
||||||
|
"advancedToolbar": {
|
||||||
|
"rowHeight": 48,
|
||||||
|
"rowCount": 1,
|
||||||
|
"spacing": 0,
|
||||||
|
"buttonWidth": 48,
|
||||||
|
"columnLayout": false,
|
||||||
|
"mappedIcons": [],
|
||||||
|
"tooltips": false,
|
||||||
|
"heightOffset": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+11
File diff suppressed because one or more lines are too long
Vendored
+11
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"id": "cmdr",
|
||||||
|
"name": "Commander",
|
||||||
|
"version": "0.5.5",
|
||||||
|
"minAppVersion": "1.4.0",
|
||||||
|
"description": "Customize your workspace by adding commands everywhere, create Macros and supercharge your mobile toolbar.",
|
||||||
|
"author": "jsmorabito & phibr0",
|
||||||
|
"authorUrl": "https://github.com/phibr0",
|
||||||
|
"fundingUrl": "https://ko-fi.com/phibr0",
|
||||||
|
"isDesktopOnly": false
|
||||||
|
}
|
||||||
Vendored
+1
File diff suppressed because one or more lines are too long
+10
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"defaultSortOrder": "alphabetical",
|
||||||
|
"enableFolderLoop": true,
|
||||||
|
"enableFolderBoundary": false,
|
||||||
|
"includedFileTypes": "markdownOnly",
|
||||||
|
"additionalExtensions": [
|
||||||
|
"canvas",
|
||||||
|
"pdf"
|
||||||
|
]
|
||||||
|
}
|
||||||
+450
@@ -0,0 +1,450 @@
|
|||||||
|
/*
|
||||||
|
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
||||||
|
if you want to view the source, please visit the github repository of this plugin
|
||||||
|
*/
|
||||||
|
|
||||||
|
var __defProp = Object.defineProperty;
|
||||||
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
||||||
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
||||||
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
||||||
|
var __export = (target, all) => {
|
||||||
|
for (var name in all)
|
||||||
|
__defProp(target, name, { get: all[name], enumerable: true });
|
||||||
|
};
|
||||||
|
var __copyProps = (to, from, except, desc) => {
|
||||||
|
if (from && typeof from === "object" || typeof from === "function") {
|
||||||
|
for (let key of __getOwnPropNames(from))
|
||||||
|
if (!__hasOwnProp.call(to, key) && key !== except)
|
||||||
|
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
||||||
|
}
|
||||||
|
return to;
|
||||||
|
};
|
||||||
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
||||||
|
|
||||||
|
// src/main.ts
|
||||||
|
var main_exports = {};
|
||||||
|
__export(main_exports, {
|
||||||
|
default: () => NeighbouringFileNavigatorPlugin
|
||||||
|
});
|
||||||
|
module.exports = __toCommonJS(main_exports);
|
||||||
|
|
||||||
|
// src/NeighbouringFileNavigator.ts
|
||||||
|
var import_obsidian = require("obsidian");
|
||||||
|
var _NeighbouringFileNavigator = class _NeighbouringFileNavigator {
|
||||||
|
constructor(settings) {
|
||||||
|
this.settings = settings;
|
||||||
|
}
|
||||||
|
static reverse(fn) {
|
||||||
|
return (a, b) => -fn(a, b);
|
||||||
|
}
|
||||||
|
getFileExplorerSortOrder(workspace) {
|
||||||
|
var _a, _b, _c, _d, _e, _f;
|
||||||
|
return (_f = (_e = (_d = (_c = (_b = (_a = workspace.getLeavesOfType) == null ? void 0 : _a.call(workspace, "file-explorer")) == null ? void 0 : _b.first()) == null ? void 0 : _c.getViewState()) == null ? void 0 : _d.state) == null ? void 0 : _e.sortOrder) != null ? _f : this.settings.defaultSortOrder;
|
||||||
|
}
|
||||||
|
getCurrentSortFn(workspace) {
|
||||||
|
const sortOrder = this.getFileExplorerSortOrder(workspace);
|
||||||
|
return _NeighbouringFileNavigator.sorters[sortOrder];
|
||||||
|
}
|
||||||
|
navigateToNextFile(workspace) {
|
||||||
|
const sortOrder = this.getFileExplorerSortOrder(workspace);
|
||||||
|
console.debug("navigateToNextFile with sortOrder", sortOrder);
|
||||||
|
const sortFn = _NeighbouringFileNavigator.sorters[sortOrder];
|
||||||
|
this.navigateToNeighbouringFile(workspace, sortFn, true);
|
||||||
|
}
|
||||||
|
navigateToPrevFile(workspace) {
|
||||||
|
const sortOrder = this.getFileExplorerSortOrder(workspace);
|
||||||
|
console.debug("navigateToPrevFile with sortOrder", sortOrder);
|
||||||
|
const sortFn = _NeighbouringFileNavigator.sorters[sortOrder];
|
||||||
|
this.navigateToNeighbouringFile(workspace, sortFn, false);
|
||||||
|
}
|
||||||
|
navigateToNextAlphabeticalFile(workspace) {
|
||||||
|
console.debug("navigateToNextAlphabeticalFile");
|
||||||
|
this.navigateToNeighbouringFile(
|
||||||
|
workspace,
|
||||||
|
_NeighbouringFileNavigator.sorters.alphabetical,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
}
|
||||||
|
navigateToPrevAlphabeticalFile(workspace) {
|
||||||
|
console.debug("navigateToPrevAlphabeticalFile");
|
||||||
|
this.navigateToNeighbouringFile(
|
||||||
|
workspace,
|
||||||
|
_NeighbouringFileNavigator.sorters.alphabetical,
|
||||||
|
false
|
||||||
|
);
|
||||||
|
}
|
||||||
|
navigateToOlderCreatedFile(workspace) {
|
||||||
|
console.debug("navigateToOlderCreatedFile");
|
||||||
|
this.navigateToNeighbouringFile(
|
||||||
|
workspace,
|
||||||
|
_NeighbouringFileNavigator.sorters.byCreatedTime,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
}
|
||||||
|
navigateToNewerCreatedFile(workspace) {
|
||||||
|
console.debug("navigateToNewerCreatedFile");
|
||||||
|
this.navigateToNeighbouringFile(
|
||||||
|
workspace,
|
||||||
|
_NeighbouringFileNavigator.sorters.byCreatedTimeReverse,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
}
|
||||||
|
navigateToOlderModifiedFile(workspace) {
|
||||||
|
console.debug("navigateToOlderModifiedFile");
|
||||||
|
this.navigateToNeighbouringFile(
|
||||||
|
workspace,
|
||||||
|
_NeighbouringFileNavigator.sorters.byModifiedTime,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
}
|
||||||
|
navigateToNewerModifiedFile(workspace) {
|
||||||
|
console.debug("navigateToNewerModifiedFile");
|
||||||
|
this.navigateToNeighbouringFile(
|
||||||
|
workspace,
|
||||||
|
_NeighbouringFileNavigator.sorters.byModifiedTimeReverse,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
}
|
||||||
|
navigateToResolvedFile(workspace, resolveTarget) {
|
||||||
|
const activeFile = workspace.getActiveFile();
|
||||||
|
if (!activeFile) return;
|
||||||
|
const toFile = resolveTarget(activeFile, this.getCurrentSortFn(workspace));
|
||||||
|
if (!toFile || toFile === activeFile) return;
|
||||||
|
workspace.getLeaf(false).openFile(toFile);
|
||||||
|
}
|
||||||
|
navigateToParentFolder(workspace) {
|
||||||
|
this.navigateToResolvedFile(workspace, (activeFile, sortFn) => {
|
||||||
|
var _a;
|
||||||
|
const parentFolder = (_a = activeFile.parent) == null ? void 0 : _a.parent;
|
||||||
|
return parentFolder ? this.findBoundaryFileInFolderTree(parentFolder, sortFn, true) : void 0;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
navigateToFirstChildFolder(workspace) {
|
||||||
|
this.navigateToResolvedFile(
|
||||||
|
workspace,
|
||||||
|
(activeFile, sortFn) => this.findFileInChildFolders(activeFile.parent, sortFn)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
navigateToNextSiblingFolder(workspace) {
|
||||||
|
this.navigateToResolvedFile(
|
||||||
|
workspace,
|
||||||
|
(activeFile, sortFn) => this.findFileInSiblingFolders(activeFile.parent, sortFn, true)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
navigateToPrevSiblingFolder(workspace) {
|
||||||
|
this.navigateToResolvedFile(
|
||||||
|
workspace,
|
||||||
|
(activeFile, sortFn) => this.findFileInSiblingFolders(activeFile.parent, sortFn, false)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
navigateToNeighbouringFile(workspace, sortFn, forward = true) {
|
||||||
|
const activeFile = workspace.getActiveFile();
|
||||||
|
if (!activeFile) return;
|
||||||
|
const files = this.getNeighbouringFiles(activeFile, sortFn);
|
||||||
|
if (!files.length) return;
|
||||||
|
const currentItem = files.findIndex(
|
||||||
|
(item) => item.name === activeFile.name
|
||||||
|
);
|
||||||
|
if (currentItem === -1) return;
|
||||||
|
const delta = forward ? 1 : -1;
|
||||||
|
const tentativeIndex = currentItem + delta;
|
||||||
|
const isAtBoundary = tentativeIndex < 0 || tentativeIndex >= files.length;
|
||||||
|
const nextIndex = this.settings.enableFolderLoop ? isAtBoundary ? forward ? 0 : files.length - 1 : tentativeIndex : Math.max(0, Math.min(tentativeIndex, files.length - 1));
|
||||||
|
let toFile = files[nextIndex];
|
||||||
|
const atFolderBoundary = !this.settings.enableFolderLoop && nextIndex === currentItem && isAtBoundary && (forward ? currentItem === files.length - 1 : currentItem === 0);
|
||||||
|
if (atFolderBoundary && this.settings.enableFolderBoundary) {
|
||||||
|
const boundaryFile = this.findBoundaryFile(
|
||||||
|
activeFile,
|
||||||
|
sortFn,
|
||||||
|
forward
|
||||||
|
);
|
||||||
|
if (boundaryFile) {
|
||||||
|
toFile = boundaryFile;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!toFile) return;
|
||||||
|
workspace.getLeaf(false).openFile(toFile);
|
||||||
|
}
|
||||||
|
filterFiletype(file) {
|
||||||
|
if (this.settings.includedFileTypes === "allFiles") return true;
|
||||||
|
if (this.settings.includedFileTypes === "markdownOnly") {
|
||||||
|
return file.extension === "md";
|
||||||
|
} else if (this.settings.includedFileTypes === "additionalExtensions") {
|
||||||
|
return file.extension === "md" || this.settings.additionalExtensions.includes(file.extension);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
getNeighbouringFiles(file, sortFn) {
|
||||||
|
return file.parent ? this.getSortedFilesInFolder(file.parent, sortFn) : [];
|
||||||
|
}
|
||||||
|
getSortedFilesInFolder(folder, sortFn) {
|
||||||
|
var _a, _b;
|
||||||
|
return (_b = (_a = folder.children) == null ? void 0 : _a.filter((child) => child instanceof import_obsidian.TFile).filter((file) => this.filterFiletype(file)).sort(sortFn)) != null ? _b : [];
|
||||||
|
}
|
||||||
|
getChildFolders(folder) {
|
||||||
|
var _a, _b;
|
||||||
|
return (_b = (_a = folder.children) == null ? void 0 : _a.filter(
|
||||||
|
(child) => child instanceof import_obsidian.TFolder
|
||||||
|
)) != null ? _b : [];
|
||||||
|
}
|
||||||
|
findFileInChildFolders(folder, sortFn) {
|
||||||
|
if (!folder) return void 0;
|
||||||
|
for (const childFolder of this.getChildFolders(folder)) {
|
||||||
|
const toFile = this.findBoundaryFileInFolderTree(
|
||||||
|
childFolder,
|
||||||
|
sortFn,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
if (toFile) return toFile;
|
||||||
|
}
|
||||||
|
return void 0;
|
||||||
|
}
|
||||||
|
findFileInSiblingFolders(currentFolder, sortFn, forward) {
|
||||||
|
if (!(currentFolder == null ? void 0 : currentFolder.parent)) return void 0;
|
||||||
|
const siblingFolders = this.getChildFolders(currentFolder.parent);
|
||||||
|
const currentFolderIndex = siblingFolders.findIndex(
|
||||||
|
(folder) => folder === currentFolder
|
||||||
|
);
|
||||||
|
if (currentFolderIndex === -1) return void 0;
|
||||||
|
const step = forward ? 1 : -1;
|
||||||
|
for (let folderIndex = currentFolderIndex + step; folderIndex >= 0 && folderIndex < siblingFolders.length; folderIndex += step) {
|
||||||
|
const toFile = this.findBoundaryFileInFolderTree(
|
||||||
|
siblingFolders[folderIndex],
|
||||||
|
sortFn,
|
||||||
|
forward
|
||||||
|
);
|
||||||
|
if (toFile) return toFile;
|
||||||
|
}
|
||||||
|
return void 0;
|
||||||
|
}
|
||||||
|
findBoundaryFileInFolderTree(folder, sortFn, forward) {
|
||||||
|
const sortedFiles = this.getSortedFilesInFolder(folder, sortFn);
|
||||||
|
const childFolders = this.getChildFolders(folder);
|
||||||
|
const orderedChildFolders = forward ? childFolders : childFolders.slice().reverse();
|
||||||
|
if (forward) {
|
||||||
|
if (sortedFiles.length) return sortedFiles[0];
|
||||||
|
for (const childFolder of orderedChildFolders) {
|
||||||
|
const file = this.findBoundaryFileInFolderTree(
|
||||||
|
childFolder,
|
||||||
|
sortFn,
|
||||||
|
forward
|
||||||
|
);
|
||||||
|
if (file) return file;
|
||||||
|
}
|
||||||
|
return void 0;
|
||||||
|
}
|
||||||
|
for (const childFolder of orderedChildFolders) {
|
||||||
|
const file = this.findBoundaryFileInFolderTree(
|
||||||
|
childFolder,
|
||||||
|
sortFn,
|
||||||
|
forward
|
||||||
|
);
|
||||||
|
if (file) return file;
|
||||||
|
}
|
||||||
|
return sortedFiles.length ? sortedFiles[sortedFiles.length - 1] : void 0;
|
||||||
|
}
|
||||||
|
findBoundaryFile(activeFile, sortFn, forward) {
|
||||||
|
let currentFolder = activeFile.parent;
|
||||||
|
if (!currentFolder) return void 0;
|
||||||
|
while (currentFolder && currentFolder.parent) {
|
||||||
|
const parentFolder = currentFolder.parent;
|
||||||
|
const boundaryFile = this.findFileInSiblingFolders(
|
||||||
|
currentFolder,
|
||||||
|
sortFn,
|
||||||
|
forward
|
||||||
|
);
|
||||||
|
if (boundaryFile) return boundaryFile;
|
||||||
|
const parentFiles = this.getSortedFilesInFolder(
|
||||||
|
parentFolder,
|
||||||
|
sortFn
|
||||||
|
);
|
||||||
|
if (parentFiles.length) {
|
||||||
|
return forward ? parentFiles[0] : parentFiles[parentFiles.length - 1];
|
||||||
|
}
|
||||||
|
currentFolder = parentFolder;
|
||||||
|
}
|
||||||
|
return void 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
_NeighbouringFileNavigator.localeSorter = (a, b) => a.basename.localeCompare(b.basename, void 0, {
|
||||||
|
numeric: true,
|
||||||
|
sensitivity: "base"
|
||||||
|
});
|
||||||
|
_NeighbouringFileNavigator.mtimeSorter = (a, b) => {
|
||||||
|
return b.stat.mtime - a.stat.mtime;
|
||||||
|
};
|
||||||
|
_NeighbouringFileNavigator.ctimeSorter = (a, b) => {
|
||||||
|
return b.stat.ctime - a.stat.ctime;
|
||||||
|
};
|
||||||
|
_NeighbouringFileNavigator.sorters = {
|
||||||
|
alphabetical: _NeighbouringFileNavigator.localeSorter,
|
||||||
|
byCreatedTime: _NeighbouringFileNavigator.ctimeSorter,
|
||||||
|
byModifiedTime: _NeighbouringFileNavigator.mtimeSorter,
|
||||||
|
alphabeticalReverse: _NeighbouringFileNavigator.reverse(_NeighbouringFileNavigator.localeSorter),
|
||||||
|
byCreatedTimeReverse: _NeighbouringFileNavigator.reverse(_NeighbouringFileNavigator.ctimeSorter),
|
||||||
|
byModifiedTimeReverse: _NeighbouringFileNavigator.reverse(_NeighbouringFileNavigator.mtimeSorter)
|
||||||
|
};
|
||||||
|
var NeighbouringFileNavigator = _NeighbouringFileNavigator;
|
||||||
|
|
||||||
|
// src/NeighbouringFileNavigatorPluginSettings.ts
|
||||||
|
var DEFAULT_SETTINGS = {
|
||||||
|
// sorting
|
||||||
|
defaultSortOrder: "alphabetical",
|
||||||
|
// navigation options
|
||||||
|
enableFolderLoop: false,
|
||||||
|
enableFolderBoundary: false,
|
||||||
|
// file mask
|
||||||
|
includedFileTypes: "markdownOnly",
|
||||||
|
additionalExtensions: ["canvas", "pdf"]
|
||||||
|
};
|
||||||
|
|
||||||
|
// src/NeighbouringFileNavigatorPluginSettingTab.ts
|
||||||
|
var import_obsidian2 = require("obsidian");
|
||||||
|
var NeighbouringFileNavigatorPluginSettingTab = class extends import_obsidian2.PluginSettingTab {
|
||||||
|
constructor(app, plugin) {
|
||||||
|
super(app, plugin);
|
||||||
|
this.plugin = plugin;
|
||||||
|
}
|
||||||
|
display() {
|
||||||
|
let { containerEl } = this;
|
||||||
|
containerEl.empty();
|
||||||
|
new import_obsidian2.Setting(containerEl).setName("Default Sort Order").setDesc("Fallback sort order used for the default command").addDropdown((dropdown) => {
|
||||||
|
dropdown.addOption("alphabetical", "Alphabetical");
|
||||||
|
dropdown.addOption("byCreatedTime", "Creation Timestamp");
|
||||||
|
dropdown.addOption("byModifiedTime", "Modification Timestamp");
|
||||||
|
dropdown.setValue(this.plugin.settings.defaultSortOrder);
|
||||||
|
dropdown.onChange(async (value) => {
|
||||||
|
this.plugin.settings.defaultSortOrder = value;
|
||||||
|
await this.plugin.saveSettings();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
new import_obsidian2.Setting(containerEl).setName("Loop Notes in Folder").setDesc("Navigate to the first note when navigating past the last note in the same folder.").addToggle((toggle) => {
|
||||||
|
toggle.setValue(this.plugin.settings.enableFolderLoop);
|
||||||
|
toggle.onChange(async (value) => {
|
||||||
|
this.plugin.settings.enableFolderLoop = value;
|
||||||
|
await this.plugin.saveSettings();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
new import_obsidian2.Setting(containerEl).setName("Continue Across Folders").setDesc("Move to adjacent folders when navigating beyond the current folder boundary.").addToggle((toggle) => {
|
||||||
|
toggle.setValue(this.plugin.settings.enableFolderBoundary);
|
||||||
|
toggle.onChange(async (value) => {
|
||||||
|
this.plugin.settings.enableFolderBoundary = value;
|
||||||
|
await this.plugin.saveSettings();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
new import_obsidian2.Setting(containerEl).setName("Included File Types").setDesc("Set which file types to include in the navigation").addDropdown((dropdown) => {
|
||||||
|
dropdown.addOption("markdownOnly", "Markdown only");
|
||||||
|
dropdown.addOption("allFiles", "All files");
|
||||||
|
dropdown.addOption("additionalExtensions", "Additional file extensions below");
|
||||||
|
dropdown.setValue(this.plugin.settings.includedFileTypes);
|
||||||
|
dropdown.onChange(async (value) => {
|
||||||
|
this.plugin.settings.includedFileTypes = value;
|
||||||
|
await this.plugin.saveSettings();
|
||||||
|
this.display();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
if (this.plugin.settings.includedFileTypes === "additionalExtensions") {
|
||||||
|
new import_obsidian2.Setting(containerEl).setName("Extensions").setDesc("List of additional file extensions to include in the navigation (comma separated)").addText((text) => {
|
||||||
|
text.setPlaceholder("canvas, pdf");
|
||||||
|
text.setValue(this.plugin.settings.additionalExtensions.join(", "));
|
||||||
|
text.onChange(async (value) => {
|
||||||
|
this.plugin.settings.additionalExtensions = value.split(",").map((ext) => ext.trim());
|
||||||
|
await this.plugin.saveSettings();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// src/main.ts
|
||||||
|
var import_obsidian3 = require("obsidian");
|
||||||
|
var NeighbouringFileNavigatorPlugin = class extends import_obsidian3.Plugin {
|
||||||
|
async onload() {
|
||||||
|
await this.loadSettings();
|
||||||
|
this.addSettingTab(
|
||||||
|
new NeighbouringFileNavigatorPluginSettingTab(this.app, this)
|
||||||
|
);
|
||||||
|
this.navigator = new NeighbouringFileNavigator(this.settings);
|
||||||
|
this.addCommand({
|
||||||
|
id: "next",
|
||||||
|
name: "Navigate to next file",
|
||||||
|
callback: () => this.navigator.navigateToNextFile(this.app.workspace)
|
||||||
|
});
|
||||||
|
this.addCommand({
|
||||||
|
id: "prev",
|
||||||
|
name: "Navigate to prev file",
|
||||||
|
callback: () => this.navigator.navigateToPrevFile(this.app.workspace)
|
||||||
|
});
|
||||||
|
this.addCommand({
|
||||||
|
id: "next-alphabetical",
|
||||||
|
name: "Navigate to next file (alphabetical)",
|
||||||
|
callback: () => this.navigator.navigateToNextAlphabeticalFile(
|
||||||
|
this.app.workspace
|
||||||
|
)
|
||||||
|
});
|
||||||
|
this.addCommand({
|
||||||
|
id: "prev-alphabetical",
|
||||||
|
name: "Navigate to prev file (alphabetical)",
|
||||||
|
callback: () => this.navigator.navigateToPrevAlphabeticalFile(
|
||||||
|
this.app.workspace
|
||||||
|
)
|
||||||
|
});
|
||||||
|
const olderCreated = {
|
||||||
|
name: "Navigate to older file (creation timestamp)",
|
||||||
|
callback: () => this.navigator.navigateToOlderCreatedFile(this.app.workspace)
|
||||||
|
};
|
||||||
|
this.addCommand({ ...olderCreated, id: "older-created" });
|
||||||
|
this.addCommand({ ...olderCreated, id: "prev-created" });
|
||||||
|
const newerCreated = {
|
||||||
|
name: "Navigate to newer file (creation timestamp)",
|
||||||
|
callback: () => this.navigator.navigateToNewerCreatedFile(this.app.workspace)
|
||||||
|
};
|
||||||
|
this.addCommand({ ...newerCreated, id: "next-created" });
|
||||||
|
this.addCommand({ ...newerCreated, id: "newer-created" });
|
||||||
|
const olderModified = {
|
||||||
|
name: "Navigate to older file (modification timestamp)",
|
||||||
|
callback: () => this.navigator.navigateToOlderModifiedFile(this.app.workspace)
|
||||||
|
};
|
||||||
|
this.addCommand({ ...olderModified, id: "older-modified" });
|
||||||
|
this.addCommand({ ...olderModified, id: "prev-modified" });
|
||||||
|
const newerModified = {
|
||||||
|
name: "Navigate to newer file (modification timestamp)",
|
||||||
|
callback: () => this.navigator.navigateToNewerModifiedFile(this.app.workspace)
|
||||||
|
};
|
||||||
|
this.addCommand({ ...newerModified, id: "next-modified" });
|
||||||
|
this.addCommand({ ...newerModified, id: "newer-modified" });
|
||||||
|
this.addCommand({
|
||||||
|
id: "folder-up",
|
||||||
|
name: "Folder up",
|
||||||
|
callback: () => this.navigator.navigateToParentFolder(this.app.workspace)
|
||||||
|
});
|
||||||
|
this.addCommand({
|
||||||
|
id: "folder-down",
|
||||||
|
name: "Folder down",
|
||||||
|
callback: () => this.navigator.navigateToFirstChildFolder(this.app.workspace)
|
||||||
|
});
|
||||||
|
this.addCommand({
|
||||||
|
id: "folder-next",
|
||||||
|
name: "Next folder",
|
||||||
|
callback: () => this.navigator.navigateToNextSiblingFolder(this.app.workspace)
|
||||||
|
});
|
||||||
|
this.addCommand({
|
||||||
|
id: "folder-prev",
|
||||||
|
name: "Prev folder",
|
||||||
|
callback: () => this.navigator.navigateToPrevSiblingFolder(this.app.workspace)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
onunload() {
|
||||||
|
}
|
||||||
|
async loadSettings() {
|
||||||
|
this.settings = Object.assign(
|
||||||
|
{},
|
||||||
|
DEFAULT_SETTINGS,
|
||||||
|
await this.loadData()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
async saveSettings() {
|
||||||
|
await this.saveData(this.settings);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* nosourcemap */
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"id": "neighbouring-files",
|
||||||
|
"name": "Neighbouring Files",
|
||||||
|
"version": "1.1.3",
|
||||||
|
"minAppVersion": "0.15.0",
|
||||||
|
"description": "Navigate to the next and previous file in the current directory",
|
||||||
|
"author": "Fabian Untermoser",
|
||||||
|
"authorUrl": "https://www.ederbit.xyz",
|
||||||
|
"fundingUrl": "https://www.ederbit.xyz/coffee",
|
||||||
|
"isDesktopOnly": false
|
||||||
|
}
|
||||||
Vendored
+1847
File diff suppressed because one or more lines are too long
+11
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"id": "sheets",
|
||||||
|
"name": "Sheets Extended",
|
||||||
|
"version": "1.2.10",
|
||||||
|
"minAppVersion": "1.5.0",
|
||||||
|
"description": "Vertical headers, merged cells, and custom css tables with advanced table compatibility",
|
||||||
|
"author": "NicoNekoru",
|
||||||
|
"authorUrl": "https://github.com/NicoNekoru",
|
||||||
|
"fundingUrl": "https://www.buymeacoffee.com/niconekoru",
|
||||||
|
"isDesktopOnly": false
|
||||||
|
}
|
||||||
Vendored
+35
@@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
|
||||||
|
This CSS file will be included with your plugin, and
|
||||||
|
available in the app when your plugin is enabled.
|
||||||
|
|
||||||
|
If your plugin does not need CSS, delete this file.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
.obs-sheets_error {
|
||||||
|
color: rgb(255, 100, 100);
|
||||||
|
background-color: rgba(240, 128, 128, 20%);
|
||||||
|
text-rendering: optimizeLegibility;
|
||||||
|
-webkit-tap-highlight-color: rgba(255, 255, 255, 0);
|
||||||
|
color-scheme: dark;
|
||||||
|
-webkit-user-select: text;
|
||||||
|
white-space: break-spaces;
|
||||||
|
word-break: break-word;
|
||||||
|
overflow-wrap: anywhere;
|
||||||
|
-webkit-user-modify: read-write-plaintext-only;
|
||||||
|
tab-size: 4;
|
||||||
|
box-sizing: border-box;
|
||||||
|
font-size: var(--code-size);
|
||||||
|
font-family: var(--font-monospace);
|
||||||
|
clear: left;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
margin: 0 !important;
|
||||||
|
display: block;
|
||||||
|
position: relative;
|
||||||
|
padding: 0;
|
||||||
|
max-width: var(--file-line-width);
|
||||||
|
padding-left: var(--size-4-4);
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
+9
-1
@@ -5,11 +5,19 @@ up: "[[conest]]"
|
|||||||
---
|
---
|
||||||
# Takeoff Scripts
|
# Takeoff Scripts
|
||||||
|
|
||||||
|
I often refer to "ConEst takeoff scripts"
|
||||||
|
as justification for certain of decisions,
|
||||||
|
but like the Project Management Body of Knowledge,
|
||||||
|
they do not really exist in writing.
|
||||||
|
|
||||||
Scripts should be directed,
|
Scripts should be directed,
|
||||||
limiting extraneous information.
|
limiting extraneous information.
|
||||||
|
|
||||||
## Citations
|
## Citations
|
||||||
|
|
||||||
|
For the purpose of accountability,
|
||||||
|
it is crucial that all direction have a documented origin.
|
||||||
|
|
||||||
Use footnotes to reference timestamped notes.
|
Use footnotes to reference timestamped notes.
|
||||||
|
|
||||||
Do this:
|
Do this:
|
||||||
@@ -29,4 +37,4 @@ not this:
|
|||||||
> Even when drawings show 2 separate duplex receptacles,
|
> Even when drawings show 2 separate duplex receptacles,
|
||||||
> use `DW & DISPOSAL DUAL CIR - ...`,
|
> use `DW & DISPOSAL DUAL CIR - ...`,
|
||||||
> which includes only one receptacle.
|
> which includes only one receptacle.
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -21,16 +21,8 @@ variance of actual cost/hours versus estimated,
|
|||||||
(obviously) requires estimates,
|
(obviously) requires estimates,
|
||||||
which are subject to bias and error.
|
which are subject to bias and error.
|
||||||
If you argue that subject matter expert estimates _are_ objective
|
If you argue that subject matter expert estimates _are_ objective
|
||||||
<<<<<<< HEAD
|
|
||||||
under a Bayesian interpretation,
|
under a Bayesian interpretation,
|
||||||
then sure, but then EVM is not unique.
|
then sure, but then EVM is not unique.
|
||||||
|
|
||||||
EVM WBS's, as a form of [[estimate-decomposition]],
|
EVM WBS's, as a form of [[estimate-decomposition]],
|
||||||
suffer from its weakness of compounding inaccuracy.
|
suffer from its weakness of compounding inaccuracy.
|
||||||
=======
|
|
||||||
under the Bayesian interpretation,
|
|
||||||
then sure, but then EVM is not unique.
|
|
||||||
|
|
||||||
EVM as a form of [[estimate-decomposition]]
|
|
||||||
suffers f
|
|
||||||
>>>>>>> origin/main
|
|
||||||
|
|||||||
@@ -2,10 +2,10 @@
|
|||||||
id: 2026-03-02T15:35:49-0500
|
id: 2026-03-02T15:35:49-0500
|
||||||
title: 2026-03-02 15:35:49
|
title: 2026-03-02 15:35:49
|
||||||
tags:
|
tags:
|
||||||
- status/draft
|
|
||||||
- occupational
|
- occupational
|
||||||
date-created: 2026-03-02T15:35:49-05:00
|
- status/draft
|
||||||
daily: "[[2026-03-02]]"
|
daily: "[[2026-03-02]]"
|
||||||
|
date-created: 2026-03-02T15:35:49-05:00
|
||||||
---
|
---
|
||||||
# 2026-03-02 15:35:49
|
# 2026-03-02 15:35:49
|
||||||
|
|
||||||
@@ -14,4 +14,4 @@ daily: "[[2026-03-02]]"
|
|||||||
Change order for awarded project [[belle-meade-plaza|Belle Meade Plaza]]
|
Change order for awarded project [[belle-meade-plaza|Belle Meade Plaza]]
|
||||||
|
|
||||||
Distribution Panel "DPCT2" was deleted,
|
Distribution Panel "DPCT2" was deleted,
|
||||||
orphaned loads to be served from "DPCT" (previously "DPCT1")
|
orphaned loads to be served from "DPCT" (previously "DPCT1")
|
||||||
|
|||||||
@@ -207,7 +207,8 @@ and completes each systems accurately (FA/DAS/2Way).
|
|||||||
|
|
||||||
Zane references Electrical and Low Voltage drawings
|
Zane references Electrical and Low Voltage drawings
|
||||||
to determine job requirements for accurate take-off of the Telecom system.
|
to determine job requirements for accurate take-off of the Telecom system.
|
||||||
Telecom seems to be a living system that changes between initial take-off to completion,
|
Telecom seems to be a living system
|
||||||
|
that changes between initial take-off to completion,
|
||||||
and Zane does a good job to stay on top of it.
|
and Zane does a good job to stay on top of it.
|
||||||
Can improve speed of take-off
|
Can improve speed of take-off
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ with clarification by [[joel-jansen]]:
|
|||||||
> in dry locations only.
|
> in dry locations only.
|
||||||
|
|
||||||
> [!quote] Joel Jansen 2026-03-10 (pp.)
|
> [!quote] Joel Jansen 2026-03-10 (pp.)
|
||||||
> Takeoff as specified
|
> Take off as specified
|
||||||
|
|
||||||
### Liquid-Tight Conduit
|
### Liquid-Tight Conduit
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,8 @@ with a search algorithm like [A*](https://en.wikipedia.org/wiki/A*_search_algori
|
|||||||
Such a program could also calculate voltage drop.
|
Such a program could also calculate voltage drop.
|
||||||
|
|
||||||
I think, though, I may have been unfair to my employers (current and previous).
|
I think, though, I may have been unfair to my employers (current and previous).
|
||||||
Innovative methods will always be bottlenecked by [[accubid|Accubid]]'s strict input pattern,
|
Innovative methods will always be bottlenecked
|
||||||
|
by [[accubid|Accubid]]'s strict input pattern,
|
||||||
but there are still opportunities for improvement
|
but there are still opportunities for improvement
|
||||||
that can comply with existing expectations of evidence.
|
that can comply with existing expectations of evidence.
|
||||||
|
|
||||||
|
|||||||
@@ -26,8 +26,11 @@ be used to track
|
|||||||
Intent is too provide information to the bid team
|
Intent is too provide information to the bid team
|
||||||
potentially to be qualified in future bids.
|
potentially to be qualified in future bids.
|
||||||
|
|
||||||
> 1. ConEst deviates from specs based on direction from [[pdi-bid-estimating|Bid]].
|
> 1. ConEst deviates from specs
|
||||||
|
> based on direction from [[pdi-bid-estimating|Bid]].
|
||||||
|
>
|
||||||
> 2. Awarded contract does not include respect for the direction
|
> 2. Awarded contract does not include respect for the direction
|
||||||
|
>
|
||||||
> 3. Ops, not aware of direction, believes ConEst takeoff was in error.
|
> 3. Ops, not aware of direction, believes ConEst takeoff was in error.
|
||||||
|
|
||||||
Intent is to improve transparency,
|
Intent is to improve transparency,
|
||||||
|
|||||||
@@ -19,9 +19,11 @@ Follow-up to [[2026-03-19_09-00-43]]
|
|||||||
> Following up from our meeting yesterday.
|
> Following up from our meeting yesterday.
|
||||||
> Please see attached for the Pre-takeoff template and example.
|
> Please see attached for the Pre-takeoff template and example.
|
||||||
>
|
>
|
||||||
> * The template is saved here: S:\Estimating\7 ConEst Team\ConEst Process Documents
|
> * The template is saved here:
|
||||||
|
> S:\Estimating\7 ConEst Team\ConEst Process Documents
|
||||||
>
|
>
|
||||||
> * When completed please save in #4. Notes & E-mails within the project folder.
|
> * When completed please save in
|
||||||
|
> #4. Notes & E-mails within the project folder.
|
||||||
>
|
>
|
||||||
> * When distribution to the team,
|
> * When distribution to the team,
|
||||||
> please send content within the body of the email
|
> please send content within the body of the email
|
||||||
@@ -30,10 +32,14 @@ Follow-up to [[2026-03-19_09-00-43]]
|
|||||||
> * Distribution List:
|
> * Distribution List:
|
||||||
>
|
>
|
||||||
> * To: PCM, Senior Estimator & Estimator
|
> * To: PCM, Senior Estimator & Estimator
|
||||||
> * CC: Senior Construction Estimator, Other ConEst team members on the project, Josh Ford, Corwin Fluit & Jessalyn Williams
|
> * CC: Senior Construction Estimator,
|
||||||
|
> Other ConEst team members on the project,
|
||||||
|
> Josh Ford, Corwin Fluit & Jessalyn Williams
|
||||||
>
|
>
|
||||||
> * We will not use this exact template for Design Builds (remove spec portion of email),
|
> * We will not use this exact template for Design Builds
|
||||||
> Data Centers, Stadiums or Large commercial projects (We will customize based on SOW)
|
> (remove spec portion of email),
|
||||||
|
> Data Centers, Stadiums or Large commercial projects
|
||||||
|
> (We will customize based on SOW)
|
||||||
>
|
>
|
||||||
> For the tasks, I will set up a separate meeting to go over that portion,
|
> For the tasks, I will set up a separate meeting to go over that portion,
|
||||||
> feel free to leave that portion off the email until after that training.
|
> feel free to leave that portion off the email until after that training.
|
||||||
|
|||||||
@@ -9,20 +9,21 @@ daily: "[[2026-03-23]]"
|
|||||||
---
|
---
|
||||||
# 2026-03-23 12:48:49
|
# 2026-03-23 12:48:49
|
||||||
|
|
||||||
[[joel-jansen]] asked me to give feedback on the project engineer
|
[[joel-jansen]] asked me to give feedback on Christopher Glass,
|
||||||
I've had shadowing and helping me on [[charlotte-south-end-hotel]].
|
the project engineer I've had shadowing me
|
||||||
|
and helping on [[charlotte-south-end-hotel]].
|
||||||
|
|
||||||
They've been exceptionally engaged,
|
He's been exceptionally engaged,
|
||||||
with an impressive ability to follow along with procedures
|
with an impressive ability to follow along with procedures
|
||||||
that are based in electrical and general construction considerations
|
that are based in electrical and general construction considerations
|
||||||
that they weren't already familiar with.
|
that he wasn't already familiar with.
|
||||||
I told Joel the same.
|
I told Joel the same.
|
||||||
|
|
||||||
I added that I appreciated that their engagement extends
|
I added that I appreciated that his engagement extends
|
||||||
to my explanations of my thought processes during takeoff,
|
to my explanations of my thought processes during takeoff,
|
||||||
which can be quite abstract.
|
which can be quite abstract.
|
||||||
|
|
||||||
I found the PE's receptivity
|
I found Chris's receptivity
|
||||||
a pleasant surprise.
|
a pleasant surprise.
|
||||||
In my experience training estimating,
|
In my experience training estimating,
|
||||||
both at Ace and PDI,
|
both at Ace and PDI,
|
||||||
|
|||||||
@@ -20,14 +20,14 @@ Intent is to reduce WBS turnaround,
|
|||||||
reduce time spent sitting on WBS's completed
|
reduce time spent sitting on WBS's completed
|
||||||
except for pending tasks.
|
except for pending tasks.
|
||||||
|
|
||||||
A task is "missing"
|
A task is "missing" if
|
||||||
if it is necessary to complete the WBS
|
1. it is necessary to complete the WBS
|
||||||
and it is not already open (or completed) in BPM.
|
2. it is not already open (or completed) in BPM.
|
||||||
|
|
||||||
* **BPM > Bid History:** Tasks within the current Bid Round
|
* **BPM > Bid History:** Tasks within the current Bid Round
|
||||||
* **BPM > Tasks:** Tasks outside of Bid Round
|
* **BPM > Tasks:** Tasks outside of Bid Round
|
||||||
|
|
||||||
Tasks > 1. Open Tasks
|
Tasks > 1. Open Tasks \
|
||||||
Tasks > 2. Completed Tasks
|
Tasks > 2. Completed Tasks
|
||||||
|
|
||||||
* Constructability Review
|
* Constructability Review
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ daily: "[[2026-03-26]]"
|
|||||||
## 1990 K Street: ConEst Manager Review
|
## 1990 K Street: ConEst Manager Review
|
||||||
|
|
||||||
[[conest-manager-review]] for [[1990-k-street]]
|
[[conest-manager-review]] for [[1990-k-street]]
|
||||||
lead by Josh Ford and [[joel-jansen]]
|
lead by [[josh-ford|Josh Ford]] and [[joel-jansen|Joel Jansen]]
|
||||||
|
|
||||||
### Purpose of ConEst Manager Review
|
### Purpose of ConEst Manager Review
|
||||||
|
|
||||||
@@ -53,12 +53,14 @@ to be confirmed with [[christian-pereiro]].
|
|||||||
|
|
||||||
### EV Chargers
|
### EV Chargers
|
||||||
|
|
||||||
EV Chargers were erroneously placed in `System` "EL - Electrical".
|
> [!failure]
|
||||||
|
> EV Chargers were erroneously placed in `System` "EL - Electrical".
|
||||||
|
|
||||||
### Lighting Controls
|
### Lighting Controls
|
||||||
|
|
||||||
Josh was looking for for energy code
|
> [!failure]
|
||||||
not present in pre-takeoff email or OneNote.
|
> Josh was looking for for energy code
|
||||||
|
> not present in pre-takeoff email or OneNote.
|
||||||
|
|
||||||
ASHRAE 2016
|
ASHRAE 2016
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,9 @@ attended by [[joel-jansen]] and myself.
|
|||||||
|
|
||||||
"MSA TO BUSDUCT"
|
"MSA TO BUSDUCT"
|
||||||
needs more elbows: added.
|
needs more elbows: added.
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
Josh talked about necessary pullboxes,
|
Josh talked about necessary pullboxes,
|
||||||
but they were not added.
|
but they were not added.
|
||||||
Josh stated the purpose of the closeout budget
|
Josh stated the purpose of the closeout budget
|
||||||
@@ -25,6 +28,8 @@ is to prevent procurement from buying sizes
|
|||||||
that may be chosen arbitrarily.
|
that may be chosen arbitrarily.
|
||||||
Added $5,000 to the budget.
|
Added $5,000 to the budget.
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
Concern was expressed
|
Concern was expressed
|
||||||
that feeders up from Main Elec may need to be lengthened
|
that feeders up from Main Elec may need to be lengthened
|
||||||
to follow MSA TO BUSDUCT routing shown on floor plans.
|
to follow MSA TO BUSDUCT routing shown on floor plans.
|
||||||
@@ -53,13 +58,13 @@ Josh complemented subfeed routing:
|
|||||||
"That's taking pride in your work."
|
"That's taking pride in your work."
|
||||||
|
|
||||||
I have had hesitation that it was worth doing,
|
I have had hesitation that it was worth doing,
|
||||||
if someone told be it was a waste of time,
|
if someone told me it was a waste of time,
|
||||||
I would not have been inclined to disagree.
|
I would not have been inclined to disagree.
|
||||||
|
|
||||||
#### Units
|
#### Units
|
||||||
|
|
||||||
Unit receptacles are shown controlled by master switch system.
|
Unit receptacles are shown controlled by master switch system.
|
||||||
I assumed full control (not half) so no made no consideration in takeoff.
|
I assumed full control (not half) so made no consideration in takeoff.
|
||||||
Approved.
|
Approved.
|
||||||
|
|
||||||
#### Lighting Control
|
#### Lighting Control
|
||||||
@@ -79,7 +84,7 @@ DO NOT USE `System` "LV - Lighting Controls System" EVER
|
|||||||
|
|
||||||
> [!quote] Josh Ford
|
> [!quote] Josh Ford
|
||||||
> We're carrying material handling
|
> We're carrying material handling
|
||||||
> because we own fixtures and its a tall building
|
> because we own fixtures and it's a tall building
|
||||||
|
|
||||||
#### Labor Plan
|
#### Labor Plan
|
||||||
|
|
||||||
|
|||||||
@@ -22,9 +22,11 @@ I would not be surprised to hear of an estimator responding this way
|
|||||||
even after Hubbard's calibration.
|
even after Hubbard's calibration.
|
||||||
Hubbard repeatedly conflates estimates of uncertain events
|
Hubbard repeatedly conflates estimates of uncertain events
|
||||||
with personal estimates of trivia questions with certain answers.
|
with personal estimates of trivia questions with certain answers.
|
||||||
These are functionally identical,
|
Under Bayesian statistics these cases are identical,
|
||||||
but _feel_ very different.
|
but they still _feel_ very different.
|
||||||
Hubbard could do better to address this bias.
|
Hubbard could do better to address this bias.
|
||||||
|
|
||||||
If you don't know the answer offhand,
|
If you don't know the answer offhand, imagine it has been lost to time.
|
||||||
imagine it has been lost to time.
|
According to most discographers,
|
||||||
|
The Winstons' _Color Him Father_ (the origin of the Amen break)
|
||||||
|
was released "May 1969", with no date.
|
||||||
|
|||||||
@@ -8,11 +8,18 @@ date-created: 2026-04-08T13:53:59-04:00
|
|||||||
---
|
---
|
||||||
# 2026-04-08 13:53:59
|
# 2026-04-08 13:53:59
|
||||||
|
|
||||||
> [!quote] [[hubbard_2025_project-management#Conflating Uncertainty with Knowing Nothing]] (text decoration added)
|
> [!quote] Hubbard et al[^1]
|
||||||
> An assumption is a statement we treat as true for the sake of argument, regardless of whether it is true.
|
> An assumption is a statement
|
||||||
> Assumptions are necessary if you have to use deterministic accounting methods with exact points as values.
|
> we treat as true for the sake of argument,
|
||||||
|
> regardless of whether it is true.
|
||||||
|
> Assumptions are necessary
|
||||||
|
> if you have to use deterministic accounting methods
|
||||||
|
> with exact points as values.
|
||||||
> ==You rarely, if ever, know an exact point with certainty,==
|
> ==You rarely, if ever, know an exact point with certainty,==
|
||||||
> ==so any such value must be an assumption.==
|
> ==so any such value must be an assumption.==
|
||||||
|
|
||||||
|
[^1]: [[hubbard_2025_project-management#Conflating Uncertainty with Knowing Nothing]]
|
||||||
|
(text decoration added)
|
||||||
|
|
||||||
Assumptions are frowned upon in [[construction-estimating]],
|
Assumptions are frowned upon in [[construction-estimating]],
|
||||||
but they are only made necessary by the insistence on exact values.
|
but they are only made necessary by the insistence on exact values.
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ Data grabbed from The Hub last year before I lost access
|
|||||||
has both sale price and cost at exactly $19,906,645.23.
|
has both sale price and cost at exactly $19,906,645.23.
|
||||||
|
|
||||||
> [!aside]
|
> [!aside]
|
||||||
> Obviously this is doctored,
|
> Obviously this is phony,
|
||||||
> which is immensely frustrating,
|
> which is immensely frustrating,
|
||||||
> but irrelevant to this note.
|
> but irrelevant to this note.
|
||||||
|
|
||||||
|
|||||||
@@ -30,9 +30,9 @@ and with that I feel my understanding has doubled.
|
|||||||
At 5,976,038 sqft per BPM
|
At 5,976,038 sqft per BPM
|
||||||
that comes out to almost exactly $0.04 per sqft.
|
that comes out to almost exactly $0.04 per sqft.
|
||||||
|
|
||||||
If ConEst is budgeted per square foot
|
ConEst is budgeted per square foot
|
||||||
then it should follow that ConEst effort
|
which suggests that total ConEst effort
|
||||||
should be proportional to building area,
|
is expected to be proportional to building area,
|
||||||
but this is not usually the case in practice.
|
but this is not usually the case in practice.
|
||||||
Since larger jobs tend to have more typical work,
|
Since larger jobs tend to have more typical work,
|
||||||
jobs of every size tend to take about two weeks
|
jobs of every size tend to take about two weeks
|
||||||
|
|||||||
@@ -21,8 +21,8 @@ but when there was still vocal opposition
|
|||||||
to its adoption as such.
|
to its adoption as such.
|
||||||
|
|
||||||
In elementary school I was taught how to use the library traditionally
|
In elementary school I was taught how to use the library traditionally
|
||||||
and I heard every week that on Wikipedia
|
and I heard every week
|
||||||
erroneous content is presented as fact.
|
that on Wikipedia erroneous content is presented as fact.
|
||||||
At the time I took issue with the warning,
|
At the time I took issue with the warning,
|
||||||
now I recognize it as implicit [[nirvana-fallacy]].
|
now I recognize it as implicit [[nirvana-fallacy]].
|
||||||
Print encyclopedias have the same problem
|
Print encyclopedias have the same problem
|
||||||
|
|||||||
@@ -44,9 +44,9 @@ Just a decade after the Rolodex was killed,
|
|||||||
but already two from today.
|
but already two from today.
|
||||||
|
|
||||||
In another another three
|
In another another three
|
||||||
my kid will say the same.
|
my kid will say the same:
|
||||||
Just a decade after the Rolodex was killed,
|
"Just a decade after the Rolodex was killed,
|
||||||
but already five from today.
|
but already five from today."
|
||||||
|
|
||||||
Chips get faster,
|
Chips get faster,
|
||||||
apps get slower.
|
apps get slower.
|
||||||
|
|||||||
@@ -8,11 +8,12 @@ daily: "[[2026-04-12]]"
|
|||||||
---
|
---
|
||||||
# 2026-04-12 02:23:28
|
# 2026-04-12 02:23:28
|
||||||
|
|
||||||
Speaking to a mechanical engineer formerly employed by PDI
|
Speaking to a mechanical engineer
|
||||||
|
formerly employed by [[power-design-inc|PDI]]
|
||||||
I asked if they had any examples of PDI-specific practice
|
I asked if they had any examples of PDI-specific practice
|
||||||
that they had been lead to believe was industry standard.
|
that they had been lead to believe was industry standard.
|
||||||
They said that the drafting that they were expected to perform
|
They said that the drafting that they were expected to perform
|
||||||
was at an unhappy middle ground of detail
|
was at an unhappy middle ground of granularity
|
||||||
between the practice they were taught in school
|
between the practice they were taught in school
|
||||||
would be appropriate for their skill
|
would be appropriate for their skill
|
||||||
and that which they associated with operations.
|
and that which they associated with operations.
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ because one can not think as deeply while standing as while sitting.[^1]
|
|||||||
I think the largest part of my tendency
|
I think the largest part of my tendency
|
||||||
is that I don't like people watching me work.
|
is that I don't like people watching me work.
|
||||||
|
|
||||||
He clarified that he did this in order to _focus_,
|
He clarified that he did this _in order to focus_,
|
||||||
which I have heard before but never gave much credit.
|
which I have heard before but never gave much credit.
|
||||||
I then made the now obvious connection
|
I then made the now obvious connection
|
||||||
that impairing deep thinking is exactly the method
|
that impairing deep thinking is exactly the method
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ to prevent the most pain from future mistakes.
|
|||||||
***
|
***
|
||||||
|
|
||||||
Rationale is the most important part of the entry.
|
Rationale is the most important part of the entry.
|
||||||
It's not helpful to say
|
It's not helpful to say "I just wasn't thinking".
|
||||||
If that's truly what seems to be the cause,
|
If that's truly what seems to be the cause,
|
||||||
consider your state at the time:
|
consider your state at the time:
|
||||||
Were you mentally exhausted?
|
Were you mentally exhausted?
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ daily: "[[2026-04-15]]"
|
|||||||
---
|
---
|
||||||
# 2026-04-15 17:31:57
|
# 2026-04-15 17:31:57
|
||||||
|
|
||||||
A peer, not intending to,
|
[[william-bonn|Willie]], not intending to,
|
||||||
convinced me I should buy my next car
|
convinced me I should buy my next car
|
||||||
as much over email as possible.
|
as much over email as possible.
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,8 @@ daily: "[[2026-04-15]]"
|
|||||||
The [Gell-Mann amnesia effect](https://en.wikipedia.org/wiki/Michael_Crichton#%22Gell-Mann_amnesia_effect%22)
|
The [Gell-Mann amnesia effect](https://en.wikipedia.org/wiki/Michael_Crichton#%22Gell-Mann_amnesia_effect%22)
|
||||||
may explain my tendency to rave about literature on other disciplines.
|
may explain my tendency to rave about literature on other disciplines.
|
||||||
I am a bitter detractor of Mike Holt,
|
I am a bitter detractor of Mike Holt,
|
||||||
(who may be the only thing approaching a published researcher in our shared fields[^1])
|
(who may be the only thing approaching a published researcher
|
||||||
|
in our shared fields[^1])
|
||||||
but I'm quick to ignore typos and other presentation issues
|
but I'm quick to ignore typos and other presentation issues
|
||||||
which may be indicative of low rigor
|
which may be indicative of low rigor
|
||||||
in books and articles for adjacent fields.
|
in books and articles for adjacent fields.
|
||||||
|
|||||||
@@ -9,7 +9,8 @@ daily: "[[2026-04-29]]"
|
|||||||
## Soldiering
|
## Soldiering
|
||||||
|
|
||||||
[**Soldiering**](https://en.wikipedia.org/wiki/Scientific_management#Soldiering)
|
[**Soldiering**](https://en.wikipedia.org/wiki/Scientific_management#Soldiering)
|
||||||
describes the practice of performing the bare minimum necessary to avoid punishment.
|
describes the practice of workers
|
||||||
|
performing to the bare minimum necessary to avoid punishment.
|
||||||
|
|
||||||
Coined in [[taylor_1911_scientific-management]],
|
Coined in [[taylor_1911_scientific-management]],
|
||||||
though Taylor acknowledged the tendency was given many names.
|
though Taylor acknowledged the tendency was given many names.
|
||||||
|
|||||||
@@ -27,7 +27,8 @@ Evidence for the theory seems to come down to two points:
|
|||||||
|
|
||||||
* **Zampanò is personally invested in _The Navidson Record_.**
|
* **Zampanò is personally invested in _The Navidson Record_.**
|
||||||
It is widely understood that _House of Leaves_
|
It is widely understood that _House of Leaves_
|
||||||
(by Zampanò, not the fictional book Navy reads in the _Record_)
|
(by Zampanò, not by Danielewski,
|
||||||
|
also not the fictional book Navy reads in the _Record_)
|
||||||
is allegorical for Zampanò's blindness.
|
is allegorical for Zampanò's blindness.
|
||||||
At times, Zampanò refers to Navy in the first person.
|
At times, Zampanò refers to Navy in the first person.
|
||||||
These do not prove he invented the narrative,
|
These do not prove he invented the narrative,
|
||||||
|
|||||||
@@ -15,8 +15,6 @@ received while working on [[hilltop-gardens|Hilltop Gardens]].
|
|||||||
|
|
||||||
Relevant to [[two-way-takeoff]]:
|
Relevant to [[two-way-takeoff]]:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
> [!quote] Ben O'Brien's OneNote: Takeoff/(FA RISER + 2-WAY)
|
> [!quote] Ben O'Brien's OneNote: Takeoff/(FA RISER + 2-WAY)
|
||||||
> * Horizontal:
|
> * Horizontal:
|
||||||
> * Length:
|
> * Length:
|
||||||
|
|||||||
Reference in New Issue
Block a user