vault backup: 2026-05-29 11:17:04

This commit is contained in:
2026-05-29 11:17:04 -04:00
parent 617c7b6718
commit 8af0c4786e
8 changed files with 102 additions and 283 deletions
+1 -3
View File
@@ -1,5 +1,3 @@
{
"pinned": [
"editor:toggle-source"
]
"pinned": null
}
+1 -2
View File
@@ -25,6 +25,5 @@
"neighbouring-files",
"cmdr",
"sheets",
"tabout",
"obsidian-tidy-footnotes"
"tabout"
]
+1 -1
View File
@@ -11,7 +11,7 @@
"page-preview": true,
"daily-notes": false,
"templates": false,
"note-composer": true,
"note-composer": false,
"command-palette": true,
"slash-command": false,
"editor-status": true,
-189
View File
@@ -1,189 +0,0 @@
/*
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: () => TidyFootnotes
});
module.exports = __toCommonJS(main_exports);
var import_obsidian = require("obsidian");
// src/tidyFootnotes.ts
var reKey = /\[\^(.+?(?=\]))\]/gi;
var reDefinition = /^\[\^([^\]]+)\]\:/;
function isNumeric(value) {
return !isNaN(value - parseFloat(value));
}
function tidyFootnotes(editor) {
let markers = [];
let definitions = /* @__PURE__ */ new Map();
let firstDefinitionLine = -1;
let definitionsIndexed = /* @__PURE__ */ new Map();
const lineCount = editor.lineCount();
let prevKey = "";
for (let i = 0; i < lineCount; i++) {
const line = editor.getLine(i);
let isDefinition = false;
let match;
if (prevKey.length) {
const hasIndent = /^[ \t]/.test(line);
const isLastLine = i === lineCount - 1;
if (hasIndent || line.length === 0 && !isLastLine) {
const value = definitions.get(prevKey);
definitions.set(prevKey, value + "\n" + line);
markers[markers.length - 1].length++;
continue;
} else {
prevKey = "";
}
}
while ((match = reDefinition.exec(line)) !== null) {
if (match.length < 1)
return;
isDefinition = true;
let key = match[1];
let value = line.substring(match[0].length);
definitions.set(key, value);
prevKey = key;
let marker = {
key,
line: i,
index: 0,
length: 0,
isDefinition: true
};
markers.push(marker);
if (firstDefinitionLine === -1) {
firstDefinitionLine = i;
}
break;
}
if (isDefinition)
continue;
while ((match = reKey.exec(line)) !== null) {
if (match.length < 1)
return;
let key = match[1];
let marker = {
key,
line: i,
index: match.index,
length: match[0].length,
isDefinition: false
};
markers.push(marker);
if (!definitionsIndexed.has(key)) {
definitionsIndexed.set(key, {
key,
newKey: key,
isNumber: isNumeric(key),
value: ""
});
}
}
}
definitions.forEach((value, key) => {
definitionsIndexed.set(key, {
key,
newKey: key,
isNumber: isNumeric(key),
value
});
});
let count = 1;
let definitionsStr = "";
definitionsIndexed.forEach((definition, marker) => {
let key = definition.key;
if (definition.isNumber) {
const current = definitionsIndexed.get(marker);
key = count.toString();
definitionsIndexed.set(marker, {
...current,
newKey: key
});
count++;
}
definitionsStr += `[^${key}]:${definition.value}
`;
});
const markersCount = markers.length;
for (let i = markersCount - 1; i >= 0; i--) {
const marker = markers[i];
const markerLine = marker.line;
if (marker.isDefinition) {
let rangeStart, rangeEnd;
const lineEnd = markerLine + 1 + marker.length;
if (lineEnd === editor.lineCount()) {
rangeStart = { line: markerLine, ch: 0 };
rangeEnd = { line: lineEnd - 1, ch: Infinity };
} else {
rangeStart = { line: markerLine, ch: 0 };
rangeEnd = { line: lineEnd, ch: 0 };
}
if (markerLine === firstDefinitionLine) {
editor.replaceRange(definitionsStr, rangeStart, rangeEnd);
continue;
}
editor.replaceRange("", rangeStart, rangeEnd);
continue;
}
const definition = definitionsIndexed.get(marker.key);
const newKey = definition.newKey;
if (marker.key === newKey)
continue;
const line = editor.getLine(markerLine);
const prefix = line.substring(0, marker.index);
const newMarker = `[^${newKey}]`;
const suffix = line.substr(marker.index + marker.length);
const newLine = prefix + newMarker + suffix;
editor.replaceRange(
newLine,
{ line: markerLine, ch: 0 },
{ line: markerLine, ch: Infinity }
);
}
if (firstDefinitionLine == -1) {
const lineCount2 = editor.lineCount();
editor.replaceRange(
"\n\n" + definitionsStr,
{ line: lineCount2, ch: 0 },
{ line: lineCount2, ch: Infinity }
);
}
}
// src/main.ts
var TidyFootnotes = class extends import_obsidian.Plugin {
async onload() {
this.addCommand({
id: "tidy-footnotes",
name: "Tidy Footnotes",
editorCallback: (editor, view) => {
tidyFootnotes(editor);
}
});
}
};
/* nosourcemap */
-11
View File
@@ -1,11 +0,0 @@
{
"id": "obsidian-tidy-footnotes",
"name": "Tidy Footnotes",
"version": "0.1.2",
"minAppVersion": "0.11.13",
"description": "Tidy your footnotes seamlessly.",
"author": "Charlie Chao",
"authorUrl": "https://github.com/charliecm",
"fundingUrl": "https://www.buymeacoffee.com/charliecm",
"isDesktopOnly": false
}
+10
View File
@@ -0,0 +1,10 @@
---
aliases:
- PMI
- Project Management Institute (PMI)
title: Project Management Institute (PMI)
tags: []
---
# Project Management Institute (PMI)
[The Project Management Institute](https://pmi.org)
+78
View File
@@ -0,0 +1,78 @@
---
title: Project Management™ for Construction
tags: []
---
# Project Management™ for Construction
This note discusses the applicability (or lack thereof)
of [[project-management-tm]] in [[construction-contracting]].
...
That's not to say that it should be overlooked in construction applications.
There's no better source for solutions to problems that our industries share.
Specialized practices like [[lean-construction]]
are decades behind [[project-management-institute|PMI]].
However, consulting Project Management™ for relevant insight
requires acknowledging its biases.
## Limitations
### Labor Management
Project Management™ assumes workforce deficits are difficult to fill,
and that significant changes are sign of process failure.
* Qualified employees are hard to find
* Project onboarding is extensive
* Diminishing returns start early and are severe
In construction projects, labor is highly dynamic.
Workforce necessarily varies greatly through the project's lifespan,
and labor reallocation is a regular (weekly) task.
* Qualified employees are relatively plentiful, cost is the bottleneck
* Onboarding is practically nonexistent,
new employees are productive on their first day
* Diminishing returns start late and are less pronounced
### Basis of Progress
If you assume that labor is a strong predictor of cost,
and that your audience can convert between them implicitly,
then hours convey both schedule _and_ cost by their nature.
Project Management™ is primarily concerned with _schedule_,
because it assumes that labor is a strong predictor of cost.
* Labor is the greatest (if not only) project cost.
* Labor (and therefore cost) is effectively fixed for a given scope.
As such, Project Managers™ may discuss project cost in hours,
with no loss of detail.
In construction projects, labor is known to be a weak predictor of cost.
* Labor is almost always a minority of project cost.
* Functionally equal options have a large spread
of possible hours-to-complete and total cost values.
As such, construction project managers must discuss project cost directly.
I believe this difference is one purely of language,
and doesn't represent a difference in philosophy.
However, it does speak to Project Management™'s tendency to overgeneralize.
### Material
The use of labor as a measure of cost is not a difference of philosophy itself,
however Project Management™ is only able to get away with conflating labor and cost
because it assumes Material cost is negligible,
or that it can be allocated as overhead.
What I'm calling Material cost
refers to direct costs not associated with labor.
These costs vary wildly,
even independent of installation requirements,
due to [[gold-plating]] and owner furnished scope.
+11 -77
View File
@@ -11,19 +11,20 @@ tags:
## TALK
This note may include generic criticism,
but discussion of the applicability (or lack thereof)
of Project Management™ to construction specifically
should be relegated to [[project-management-tm-for-construction]]
%%
This note is distinguished from [[project-management]]
by referring specifically to doctrine/curriculum,
especially as documented by [The Project Management Institute](htpps://pmi.org).
especially as documented by [[project-management-institute|PMI]].
I've opted to humorously style this concept as Project Management™ for clarity.
That is, "Project management" could never be wrong or even misguided,
That is, "project management" could never be wrong or even misguided,
but Project Management™ can (and often is).
This note may include generic criticism,
but discussion of the applicability (or lack thereof)
of Project Management™ to construction specifically
## Criticism
The term "Project Management" is deliberately vague,
@@ -33,8 +34,9 @@ maximizes its applicability across industries.
There are many core Project Management™ ideas
that have no parallel in other industries,
and industries often have problems of project management
that Project Management™ doctrine has no good solutions for.
See [[project-management-tm-for-construction]] for examples.
that Project Management™ doctrine has no good solutions for.[^1]
[^1]: See [[project-management-tm-for-construction]].
I would posit that, despite its cross-discipline language,
Project Management™ practice is only _universally_ applicable
@@ -45,72 +47,4 @@ to _software_ project management.
> humorously points out
> that PMI may not be in touch with _any_ part of its audience
> if they are able to release a publication "3 years overdue"
> without embarrassment.[^1]
[^1]: p. 103
That's not to say that it should be overlooked in construction applications.
There's no better source for solutions to problems that our industries share.
Specialized practices like [[lean-construction]] are decades behind PMI.
However, consulting Project Management™ for relevant insight
requires acknowledging its biases.
## Key Differences from Construction
### Labor Management
Project Management™ assumes workforce deficits are difficult to fill,
and that significant changes are sign of process failure.
* Qualified employees are hard to find
* Project onboarding is extensive
* Diminishing returns start early and are severe
In construction projects, labor is highly dynamic.
Workforce necessarily varies greatly through the project's lifespan,
and labor reallocation is a regular (weekly) task.
* Qualified employees are relatively plentiful, cost is the bottleneck
* Onboarding is practically nonexistent,
new employees are productive on their first day
* Diminishing returns start late and are less pronounced
### Basis of Progress
If you assume that labor is a strong predictor of cost,
and that your audience can convert between them implicitly,
then hours convey both schedule _and_ cost by their nature.
Project Management™ is primarily concerned with _schedule_,
because it assumes that labor is a strong predictor of cost.
* Labor is the greatest (if not only) project cost.
* Labor (and therefore cost) is effectively fixed for a given scope.
As such, Project Managers™ may discuss project cost in hours,
with no loss of detail.
In construction projects, labor is known to be a weak predictor of cost.
* Labor is almost always a minority of project cost.
* Functionally equal options have a large spread
of possible hours-to-complete and total cost values.
As such, construction project managers must discuss project cost directly.
I believe this difference is one purely of language,
and doesn't represent a difference in philosophy.
However, it does speak to Project Management™'s tendency to overgeneralize.
### Material
The use of labor as a measure of cost is not a difference of philosophy itself,
however Project Management™ is only able to get away with conflating labor and cost
because it assumes Material cost is negligible,
or that it can be allocated as overhead.
What I'm calling Material cost
refers to direct costs not associated with labor.
These costs vary wildly,
even independent of installation requirements,
due to [[gold-plating]] and owner furnished scope.
> without embarrassment. (p. 103)