Compare commits
26 Commits
3bdd11ec1b
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 3b534f5f1f | |||
| 5c93796a8d | |||
| dd282a64ac | |||
| 314c84cd90 | |||
| 75ec755378 | |||
| ccbc2f4a29 | |||
| 9b83a7a6bb | |||
| 58f69d5330 | |||
| 660e4aed75 | |||
| 845ac5c3aa | |||
| 296a9644c4 | |||
| 424f765ef6 | |||
| d5afc2358c | |||
| 58150b984f | |||
| b6bd7ab8e8 | |||
| 539b853443 | |||
| c4e434d919 | |||
| b623e68c5e | |||
| 0e83a49bc9 | |||
| ed446a8469 | |||
| b8e6eb7588 | |||
|
|
174ea9eab7 | ||
| be701009ba | |||
| 717066ff88 | |||
| 8d2c3cdc66 | |||
| 122462f3eb |
59
.obsidian/graph.json
vendored
59
.obsidian/graph.json
vendored
@@ -1,46 +1,81 @@
|
|||||||
{
|
{
|
||||||
"collapse-filter": true,
|
"collapse-filter": false,
|
||||||
"search": "",
|
"search": "",
|
||||||
"showTags": false,
|
"showTags": false,
|
||||||
"showAttachments": false,
|
"showAttachments": false,
|
||||||
"hideUnresolved": false,
|
"hideUnresolved": false,
|
||||||
"showOrphans": true,
|
"showOrphans": true,
|
||||||
"collapse-color-groups": false,
|
"collapse-color-groups": true,
|
||||||
"colorGroups": [
|
"colorGroups": [
|
||||||
{
|
{
|
||||||
"query": "SQL",
|
"query": "tag:#SQL-ASIX ",
|
||||||
"color": {
|
"color": {
|
||||||
"a": 1,
|
"a": 1,
|
||||||
"rgb": 16514816
|
"rgb": 16776960
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"query": "file:\"Mecánica Unix - Manejo de la shell\"",
|
"query": "tag:#M9-PHP ",
|
||||||
"color": {
|
"color": {
|
||||||
"a": 1,
|
"a": 1,
|
||||||
"rgb": 16762711
|
"rgb": 7292927
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"query": "section:(#Temario-BSA)",
|
"query": "tag:#Python ",
|
||||||
"color": {
|
"color": {
|
||||||
"a": 1,
|
"a": 1,
|
||||||
"rgb": 8927487
|
"rgb": 255
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"query": "section:(#Temario-ASG)",
|
"query": "tag:#Temario-ASG ",
|
||||||
"color": {
|
"color": {
|
||||||
"a": 1,
|
"a": 1,
|
||||||
"rgb": 5431378
|
"rgb": 5431378
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"query": "file:\"README.md\"",
|
"query": "tag:#Temario-BSA ",
|
||||||
"color": {
|
"color": {
|
||||||
"a": 1,
|
"a": 1,
|
||||||
"rgb": 5431473
|
"rgb": 5431473
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"query": "tag:#M5-ASIX ",
|
||||||
|
"color": {
|
||||||
|
"a": 1,
|
||||||
|
"rgb": 16711705
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"query": "tag:#LDM-JavaScript ",
|
||||||
|
"color": {
|
||||||
|
"a": 1,
|
||||||
|
"rgb": 16770667
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"query": "tag:#LDM-HTML ",
|
||||||
|
"color": {
|
||||||
|
"a": 1,
|
||||||
|
"rgb": 16741120
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"query": "tag:#LDM-CSS ",
|
||||||
|
"color": {
|
||||||
|
"a": 1,
|
||||||
|
"rgb": 137142
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"query": "file:README.md",
|
||||||
|
"color": {
|
||||||
|
"a": 1,
|
||||||
|
"rgb": 0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"collapse-display": true,
|
"collapse-display": true,
|
||||||
@@ -48,11 +83,11 @@
|
|||||||
"textFadeMultiplier": 0,
|
"textFadeMultiplier": 0,
|
||||||
"nodeSizeMultiplier": 1,
|
"nodeSizeMultiplier": 1,
|
||||||
"lineSizeMultiplier": 1,
|
"lineSizeMultiplier": 1,
|
||||||
"collapse-forces": true,
|
"collapse-forces": false,
|
||||||
"centerStrength": 0.518713248970312,
|
"centerStrength": 0.518713248970312,
|
||||||
"repelStrength": 10,
|
"repelStrength": 10,
|
||||||
"linkStrength": 1,
|
"linkStrength": 1,
|
||||||
"linkDistance": 250,
|
"linkDistance": 250,
|
||||||
"scale": 0.19753086419753052,
|
"scale": 0.23309818327823928,
|
||||||
"close": true
|
"close": true
|
||||||
}
|
}
|
||||||
9
.obsidian/hotkeys.json
vendored
9
.obsidian/hotkeys.json
vendored
@@ -6,5 +6,14 @@
|
|||||||
],
|
],
|
||||||
"key": "AltGraph"
|
"key": "AltGraph"
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"editor:insert-codeblock": [
|
||||||
|
{
|
||||||
|
"modifiers": [
|
||||||
|
"Mod",
|
||||||
|
"Shift"
|
||||||
|
],
|
||||||
|
"key": "C"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
"marginBottom": "10",
|
"marginBottom": "10",
|
||||||
"marginLeft": "10",
|
"marginLeft": "10",
|
||||||
"marginRight": "10",
|
"marginRight": "10",
|
||||||
"displayHeader": false,
|
"displayHeader": true,
|
||||||
"displayFooter": true,
|
"displayFooter": true,
|
||||||
"cssSnippet": "0"
|
"cssSnippet": "0"
|
||||||
}
|
}
|
||||||
|
|||||||
7
.obsidian/plugins/languagetool/data.json
vendored
7
.obsidian/plugins/languagetool/data.json
vendored
@@ -12,11 +12,14 @@
|
|||||||
"bash",
|
"bash",
|
||||||
"Bash",
|
"Bash",
|
||||||
"Git",
|
"Git",
|
||||||
"subshells"
|
"regex",
|
||||||
|
"subshells",
|
||||||
|
"trigger"
|
||||||
],
|
],
|
||||||
"syncDictionary": false,
|
"syncDictionary": false,
|
||||||
"remoteDictionary": [],
|
"remoteDictionary": [],
|
||||||
"pickyMode": false,
|
"pickyMode": false,
|
||||||
"longCheckNotification": true,
|
"longCheckNotification": true,
|
||||||
"staticLanguage": "es-ES"
|
"staticLanguage": "es-ES",
|
||||||
|
"disabledRules": "AGREEMENT_POSTPONED_ADJ,WRONG_IMPERATIVE"
|
||||||
}
|
}
|
||||||
62
.obsidian/plugins/obsidian-git/data.json
vendored
Normal file
62
.obsidian/plugins/obsidian-git/data.json
vendored
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
{
|
||||||
|
"commitMessage": "vault backup: {{date}}",
|
||||||
|
"autoCommitMessage": "vault backup: {{date}}",
|
||||||
|
"commitMessageScript": "",
|
||||||
|
"commitDateFormat": "YYYY-MM-DD HH:mm:ss",
|
||||||
|
"autoSaveInterval": 0,
|
||||||
|
"autoPushInterval": 0,
|
||||||
|
"autoPullInterval": 0,
|
||||||
|
"autoPullOnBoot": false,
|
||||||
|
"autoCommitOnlyStaged": false,
|
||||||
|
"disablePush": false,
|
||||||
|
"pullBeforePush": true,
|
||||||
|
"disablePopups": false,
|
||||||
|
"showErrorNotices": true,
|
||||||
|
"disablePopupsForNoChanges": false,
|
||||||
|
"listChangedFilesInMessageBody": false,
|
||||||
|
"showStatusBar": true,
|
||||||
|
"updateSubmodules": false,
|
||||||
|
"syncMethod": "merge",
|
||||||
|
"customMessageOnAutoBackup": false,
|
||||||
|
"autoBackupAfterFileChange": false,
|
||||||
|
"treeStructure": false,
|
||||||
|
"refreshSourceControl": true,
|
||||||
|
"basePath": "",
|
||||||
|
"differentIntervalCommitAndPush": false,
|
||||||
|
"changedFilesInStatusBar": false,
|
||||||
|
"showedMobileNotice": true,
|
||||||
|
"refreshSourceControlTimer": 7000,
|
||||||
|
"showBranchStatusBar": true,
|
||||||
|
"setLastSaveToLastCommit": false,
|
||||||
|
"submoduleRecurseCheckout": false,
|
||||||
|
"gitDir": "",
|
||||||
|
"showFileMenu": true,
|
||||||
|
"authorInHistoryView": "hide",
|
||||||
|
"dateInHistoryView": false,
|
||||||
|
"diffStyle": "split",
|
||||||
|
"lineAuthor": {
|
||||||
|
"show": false,
|
||||||
|
"followMovement": "inactive",
|
||||||
|
"authorDisplay": "initials",
|
||||||
|
"showCommitHash": false,
|
||||||
|
"dateTimeFormatOptions": "date",
|
||||||
|
"dateTimeFormatCustomString": "YYYY-MM-DD HH:mm",
|
||||||
|
"dateTimeTimezone": "viewer-local",
|
||||||
|
"coloringMaxAge": "1y",
|
||||||
|
"colorNew": {
|
||||||
|
"r": 255,
|
||||||
|
"g": 150,
|
||||||
|
"b": 150
|
||||||
|
},
|
||||||
|
"colorOld": {
|
||||||
|
"r": 120,
|
||||||
|
"g": 160,
|
||||||
|
"b": 255
|
||||||
|
},
|
||||||
|
"textColorCss": "var(--text-muted)",
|
||||||
|
"ignoreWhitespace": false,
|
||||||
|
"gutterSpacingFallbackLength": 5,
|
||||||
|
"lastShownAuthorDisplay": "initials",
|
||||||
|
"lastShownDateTimeFormatOptions": "date"
|
||||||
|
}
|
||||||
|
}
|
||||||
7
.obsidian/themes/SALEM/manifest.json
vendored
Normal file
7
.obsidian/themes/SALEM/manifest.json
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"name": "SALEM",
|
||||||
|
"version": "2.5.2",
|
||||||
|
"minAppVersion": "1.0.0",
|
||||||
|
"author": "Salem mohsen",
|
||||||
|
"authorUrl": "https://salemelatar.vercel.app"
|
||||||
|
}
|
||||||
713
.obsidian/themes/SALEM/theme.css
vendored
Normal file
713
.obsidian/themes/SALEM/theme.css
vendored
Normal file
@@ -0,0 +1,713 @@
|
|||||||
|
/* ########################################### */
|
||||||
|
/* ################## SALEM ################## */
|
||||||
|
/* ############# Cozy Obsidian theme ############ */
|
||||||
|
/* ########## Developed By Salem Mohsen ########## */
|
||||||
|
/* ################################################### */
|
||||||
|
|
||||||
|
body {
|
||||||
|
/* Headings */
|
||||||
|
--h1-size: 2em;
|
||||||
|
--h2-size: 1.7em;
|
||||||
|
--h3-size: 1.4em;
|
||||||
|
--h4-size: 1.2em;
|
||||||
|
--h5-size: 1.1em;
|
||||||
|
--h6-size: 1em;
|
||||||
|
|
||||||
|
/* Inline title */
|
||||||
|
--inline-title-color: var(--color-red);
|
||||||
|
--inline-title-size: 2.3em;
|
||||||
|
|
||||||
|
/* Text */
|
||||||
|
--text-on-accent: rgb(59, 53, 34);
|
||||||
|
--text-on-accent-inverted: white;
|
||||||
|
--text-muted: var(--muted-accent);
|
||||||
|
--italic-color: rgb(var(--color-crimson-rgb));
|
||||||
|
--link-decoration: none;
|
||||||
|
--link-decoration-hover: none;
|
||||||
|
--line-height-tight: 1.8;
|
||||||
|
/* Checkboxes */
|
||||||
|
--checklist-done-decoration: none;
|
||||||
|
--checklist-done-color: rgb(var(--muted-accent-rgb) / 45%);
|
||||||
|
--checkbox-radius: var(--radius-xl);
|
||||||
|
/* Lists */
|
||||||
|
--list-marker-color: var(--color-accent);
|
||||||
|
--list-bullet-border: 1px solid var(--color-accent-2);
|
||||||
|
|
||||||
|
/* Callouts and blockquote */
|
||||||
|
--blockquote-border-thickness: 3px;
|
||||||
|
--callout-radius: 20px;
|
||||||
|
--callout-default: var(--color-blue-rgb);
|
||||||
|
--callout-tip: var(--color-starred-rgb);
|
||||||
|
|
||||||
|
/* Window frame */
|
||||||
|
--titlebar-background-focused: var(--background-secondary);
|
||||||
|
/* sidebar */
|
||||||
|
--vault-name-font-size: var(--font-ui-large);
|
||||||
|
|
||||||
|
/* Canvas */
|
||||||
|
--canvas-color: var(--color-starred-rgb) !important;
|
||||||
|
--canvas-color-2: var(--color-goldFusion-rgb) !important;
|
||||||
|
--canvas-color-3: transparent !important;
|
||||||
|
|
||||||
|
/* Tabs */
|
||||||
|
--tab-text-color-focused: var(--color-base-50);
|
||||||
|
--tab-text-color-focused-active-current: var(--text-accent);
|
||||||
|
--tab-outline-color: transparent;
|
||||||
|
--tab-radius-active: 12px;
|
||||||
|
--tab-background-active: var(--active-bg);
|
||||||
|
--tab-width: 180px;
|
||||||
|
/* Properties Core Plugin */
|
||||||
|
--metadata-property-background-hover: rgba(var(--mono-rgb-100), 0.03);
|
||||||
|
--metadata-input-background-active: var(--background-secondary);
|
||||||
|
|
||||||
|
/* Dividers */
|
||||||
|
--divider-color: var(--color-base-20);
|
||||||
|
--hr-color: rgb(var(--muted-accent-rgb) / 10%);
|
||||||
|
/* Code */
|
||||||
|
--code-background: black;
|
||||||
|
--code-radius: var(--radius-l);
|
||||||
|
/* inputs */
|
||||||
|
--input-radius: var(--radius-m);
|
||||||
|
/* Tables */
|
||||||
|
--table-header-color: var(--muted-accent);
|
||||||
|
|
||||||
|
/* Colors */
|
||||||
|
--color-crimson-rgb: 172, 99, 99; /* #ac6363 */
|
||||||
|
--color-crimson: rgb(var(--color-crimson-rgb));
|
||||||
|
--color-starred-rgb: 241, 226, 25; /* #f1e219 */
|
||||||
|
--color-starred: rgb(var(--color-starred-rgb));
|
||||||
|
--color-goldFusion-rgb: 165, 156, 103; /* #A59C67 */
|
||||||
|
--color-red-rgb: 211, 69, 91;
|
||||||
|
--color-red: rgb(var(--color-red-rgb));
|
||||||
|
--color-blue-rgb: 104, 149, 210;
|
||||||
|
--color-blue: rgb(var(--color-blue-rgb));
|
||||||
|
--color-cyan-rgb: 26, 174, 159;
|
||||||
|
--color-cyan: rgb(var(--color-cyan-rgb));
|
||||||
|
--color-purple-rgb: 115, 15, 195;
|
||||||
|
--color-purple: rgb(var(--color-purple-rgb));
|
||||||
|
--color-green-rgb: 0, 175, 167;
|
||||||
|
--color-green: rgb(var(--color-green-rgb));
|
||||||
|
|
||||||
|
/* Accent HSL values
|
||||||
|
HEX = #c3ae6f*/
|
||||||
|
--accent-h: 45;
|
||||||
|
--accent-s: 41%;
|
||||||
|
--accent-l: 60%;
|
||||||
|
|
||||||
|
--color-accent-2: hsl(
|
||||||
|
var(--accent-h),
|
||||||
|
var(--accent-s),
|
||||||
|
calc(var(--accent-l) + 8.8%)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-light {
|
||||||
|
--cm-active: #f0f09839;
|
||||||
|
--active-bg: #edffd19e;
|
||||||
|
--background-primary: #fefff6;
|
||||||
|
--background-secondary: var(--background-primary);
|
||||||
|
--primary-90: rgb(254 255 246 / 0.9);
|
||||||
|
--blockquote-background-color: #dae6c5a4;
|
||||||
|
--blockquote-background-hover: rgba(246, 246, 199, 0.937);
|
||||||
|
--text-stroke-color: var(--color-base-100);
|
||||||
|
--muted-accent-rgb: 110 102 3;
|
||||||
|
--muted-accent: rgb(var(--muted-accent-rgb)); /* #c6c187*/
|
||||||
|
}
|
||||||
|
.theme-dark {
|
||||||
|
--cm-active: #2e2e1d39;
|
||||||
|
--active-bg: #2527229e;
|
||||||
|
--background-primary: #110f0f;
|
||||||
|
--primary-90: rgba(17, 15, 15, 0.9);
|
||||||
|
--background-secondary: #111111;
|
||||||
|
--blockquote-background-color: #1d1d1da4;
|
||||||
|
--blockquote-background-hover: #232323ef;
|
||||||
|
--text-stroke-color: hsl(45deg 100% 84%);
|
||||||
|
--muted-accent-rgb: 198 193 135;
|
||||||
|
--muted-accent: rgb(var(--muted-accent-rgb)); /* #c6c187*/
|
||||||
|
}
|
||||||
|
|
||||||
|
body:not(.native-scrollbars) ::-webkit-scrollbar-thumb {
|
||||||
|
border-width: 7px 7px 7px 6px !important;
|
||||||
|
}
|
||||||
|
::selection {
|
||||||
|
--text-selection: hsla(var(--color-accent-hsl), 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cm-active {
|
||||||
|
background-color: var(--cm-active);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cm-s-obsidian span.cm-formatting-highlight,
|
||||||
|
.cm-s-obsidian span.cm-highlight,
|
||||||
|
.markdown-rendered mark {
|
||||||
|
background: none;
|
||||||
|
color: var(--color-green);
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
.center-content {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul > li.task-list-item[data-task="x"] a.internal-link {
|
||||||
|
text-decoration: var(--checklist-done-decoration);
|
||||||
|
color: rgb(var(--muted-accent-rgb) / 75%);
|
||||||
|
}
|
||||||
|
.embedded-backlinks .nav-buttons-container {
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
.search-input-container input {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Properties Core Plugin */
|
||||||
|
.metadata-properties-heading.is-collapsed {
|
||||||
|
background-color: var(--background-modifier-hover);
|
||||||
|
}
|
||||||
|
.metadata-properties-heading.is-collapsed .metadata-properties-title {
|
||||||
|
color: var(--color-crimson) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.metadata-properties-heading .metadata-properties-title {
|
||||||
|
color: rgba(var(--muted-accent-rgb) / 0.4);
|
||||||
|
font-size: var(--font-ui-small);
|
||||||
|
}
|
||||||
|
|
||||||
|
.metadata-container:not(.is-collapsed) .metadata-properties-title,
|
||||||
|
.metadata-add-button {
|
||||||
|
transition: all 0.2s ease-in-out;
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
.metadata-container:hover .metadata-properties-title,
|
||||||
|
.metadata-container:hover .metadata-add-button {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.metadata-property {
|
||||||
|
--background-modifier-border: transparent;
|
||||||
|
--background-modifier-border-focus: transparent;
|
||||||
|
}
|
||||||
|
.metadata-properties-heading .collapse-indicator {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.multi-select-pill {
|
||||||
|
--pill-radius: var(--radius-m);
|
||||||
|
--pill-padding-x: var(--tag-padding-x);
|
||||||
|
--pill-border-style: dashed;
|
||||||
|
}
|
||||||
|
|
||||||
|
.metadata-property[data-property-key="cssclasses"] .multi-select-pill {
|
||||||
|
border: var(--pill-border-width) var(--pill-border-style)
|
||||||
|
var(--pill-border-color);
|
||||||
|
cursor: crosshair;
|
||||||
|
}
|
||||||
|
|
||||||
|
.metadata-property[data-property-key="cssclasses"] {
|
||||||
|
--pill-border-width: 1px;
|
||||||
|
--pill-color: var(--color-crimson);
|
||||||
|
--pill-color-hover: var(--color-crimson);
|
||||||
|
--pill-color-remove: rgba(var(--color-crimson-rgb), 0.6);
|
||||||
|
--pill-color-remove-hover: rgba(var(--color-crimson-rgb), 0.8);
|
||||||
|
--pill-decoration: underline;
|
||||||
|
--pill-background: rgba(var(--color-crimson-rgb), 0.1);
|
||||||
|
--pill-background-hover: rgba(var(--color-crimson-rgb), 0.2);
|
||||||
|
--pill-border-color: rgba(var(--color-crimson-rgb), 0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.metadata-container {
|
||||||
|
margin: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.metadata-property[data-property-key="Link"] .metadata-property-icon svg {
|
||||||
|
/* Your Width and Height must be 18, and viewport must be 0 0 24 24 */
|
||||||
|
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='lucide lucide-globe'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cline x1='2' x2='22' y1='12' y2='12'/%3E%3Cpath d='M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z'/%3E%3C/svg%3E");
|
||||||
|
color: var(--icon-color);
|
||||||
|
background-color: var(--icon-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* inline data and frontmatter */
|
||||||
|
.dataview.inline-field .dataview.inline-field-key,
|
||||||
|
.dataview.inline-field .dataview.inline-field-value {
|
||||||
|
padding-top: 2px;
|
||||||
|
padding-bottom: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* lists, tasks */
|
||||||
|
ul > li.task-list-item {
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
ul > li.task-list-item[data-task="x"],
|
||||||
|
ul > li.task-list-item[data-task="X"] {
|
||||||
|
font-weight: 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Window and tabs */
|
||||||
|
.workspace-ribbon {
|
||||||
|
border-right: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-tab-header-container {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
.workspace-split.mod-root .workspace-tab-header.is-active::before,
|
||||||
|
.workspace-split.mod-root .workspace-tab-header.is-active::after {
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
.workspace-tab-header-container-inner {
|
||||||
|
gap: var(--size-4-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace .mod-root .workspace-tab-header {
|
||||||
|
padding: var(--size-4-1) var(--size-4-2);
|
||||||
|
}
|
||||||
|
.workspace-tab-header:hover {
|
||||||
|
background: var(--tab-background-active);
|
||||||
|
}
|
||||||
|
.workspace-tab-header-container {
|
||||||
|
margin: 2px 0;
|
||||||
|
}
|
||||||
|
.mod-root .workspace-tab-header-container-inner {
|
||||||
|
padding: 0 0 0 8px;
|
||||||
|
margin-right: 10px;
|
||||||
|
margin-left: 5px;
|
||||||
|
}
|
||||||
|
.workspace-tab-header:not(.is-active):hover .workspace-tab-header-inner {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
.workspace-tab-header-inner::after {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
.workspace-tab-header-inner .workspace-tab-header-inner-icon {
|
||||||
|
color: var(--color-base-50);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tree-item-inner,
|
||||||
|
.nav-folder-title {
|
||||||
|
--line-height-tight: 2.7;
|
||||||
|
}
|
||||||
|
.nav-file .tree-item-inner {
|
||||||
|
--line-height-tight: 1.8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.is-collapsed .nav-folder-title {
|
||||||
|
background-color: transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tree-item-children.nav-folder-children
|
||||||
|
.tree-item.nav-folder
|
||||||
|
.nav-folder-title {
|
||||||
|
background: var(--active-bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.side-dock-actions,
|
||||||
|
.side-dock-settings {
|
||||||
|
border-radius: 0 10px 10px 0;
|
||||||
|
background: var(--active-bg);
|
||||||
|
padding: 14px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.HyperMD-header
|
||||||
|
:is(
|
||||||
|
.cm-header-1,
|
||||||
|
.cm-header-2,
|
||||||
|
.cm-header-3,
|
||||||
|
.cm-header-4,
|
||||||
|
.cm-header-5,
|
||||||
|
.cm-header-6,
|
||||||
|
|
||||||
|
),
|
||||||
|
.markdown-rendered :is(h1, h2, h3, h4, h5, h6) {
|
||||||
|
text-transform: capitalize;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cm-s-obsidian .cm-inline-code:not(.cm-formatting),
|
||||||
|
.markdown-rendered :is(h1, h2, h3, h4, h5, h6) code {
|
||||||
|
text-transform: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Coloring tags */
|
||||||
|
a[href="#Done"],
|
||||||
|
a[href="#done"],
|
||||||
|
a[href="#Archive"],
|
||||||
|
a[href="#archive"] {
|
||||||
|
--tag-color: #ffe4c48f;
|
||||||
|
--tag-color-hover: #ffe4c48f;
|
||||||
|
--tag-background: #7777774f;
|
||||||
|
--tag-background-hover: #a9a9a94f;
|
||||||
|
}
|
||||||
|
|
||||||
|
a[href="#Active"],
|
||||||
|
a[href="#active"],
|
||||||
|
a[href="#reading"],
|
||||||
|
a[href="#Reading"],
|
||||||
|
a[href="#In-progress"],
|
||||||
|
a[href="#in-progress"] {
|
||||||
|
--tag-color: hsla(117, 100%, 89%, 0.953);
|
||||||
|
--tag-color-hover: hsla(117, 100%, 89%, 0.897);
|
||||||
|
--tag-background: hsl(125deg 40% 20% / 63%);
|
||||||
|
--tag-background-hover: hsla(125, 39%, 20%, 0.553);
|
||||||
|
}
|
||||||
|
|
||||||
|
a[href="#Bug"],
|
||||||
|
a[href="#bug"],
|
||||||
|
a[href="#Warning"],
|
||||||
|
a[href="#warning"] {
|
||||||
|
--tag-color: #ffbfbff5;
|
||||||
|
--tag-color-hover: #ffbfbff5;
|
||||||
|
--tag-background: #9c00004f;
|
||||||
|
--tag-background-hover: #9c000075;
|
||||||
|
}
|
||||||
|
|
||||||
|
a[href="#Pending"],
|
||||||
|
a[href="#pending"] {
|
||||||
|
--tag-color: hsl(207deg 100% 92%);
|
||||||
|
--tag-color-hover: hsl(0deg 0% 100%);
|
||||||
|
--tag-background: hsl(221deg 66% 37% / 52%);
|
||||||
|
--tag-background-hover: hsl(205deg 77% 36% / 70%);
|
||||||
|
}
|
||||||
|
|
||||||
|
a[href="#Video"],
|
||||||
|
a[href="#video"],
|
||||||
|
a[href="#Article"],
|
||||||
|
a[href="#article"] {
|
||||||
|
--tag-color: hsl(18, 54%, 81%);
|
||||||
|
--tag-color-hover: hsl(18, 54%, 81%);
|
||||||
|
--tag-background: hsla(32, 89%, 40%, 0.356);
|
||||||
|
--tag-background-hover: hsla(32, 89%, 40%, 0.421);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ############################ */
|
||||||
|
/* RTL Fixes !! not needed after obsidian 1.6 update */
|
||||||
|
/* ############################ */
|
||||||
|
|
||||||
|
/* ############################ */
|
||||||
|
/* Callouts */
|
||||||
|
/* ############################ */
|
||||||
|
.markdown-rendered blockquote {
|
||||||
|
border-radius: 5px;
|
||||||
|
padding: 10px;
|
||||||
|
transition: all 0.3s ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-rendered blockquote:hover {
|
||||||
|
padding-left: 30px;
|
||||||
|
--blockquote-border-thickness: 7px;
|
||||||
|
--blockquote-background-color: var(--blockquote-background-hover) !important;
|
||||||
|
}
|
||||||
|
.callout {
|
||||||
|
transition: all 0.3s ease-in-out;
|
||||||
|
/* border: 1px solid rgb(var(--callout-color), 0.64); */
|
||||||
|
}
|
||||||
|
|
||||||
|
.callout-icon .svg-icon,
|
||||||
|
.callout-title-inner {
|
||||||
|
color: var(--callout-title-text);
|
||||||
|
}
|
||||||
|
|
||||||
|
.callout-content {
|
||||||
|
padding: 8px 16px !important;
|
||||||
|
}
|
||||||
|
.callout-content > p:last-child,
|
||||||
|
.callout-content > ul:last-child,
|
||||||
|
.callout-content > ol:last-child {
|
||||||
|
margin-bottom: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.callout-content > p:first-child,
|
||||||
|
.callout-content > ul:first-child,
|
||||||
|
.callout-content > ol:first-child {
|
||||||
|
margin-top: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ############################ */
|
||||||
|
/* Special Custom CallOuts */
|
||||||
|
/* ############################ */
|
||||||
|
/* Center Callout */
|
||||||
|
.callout[data-callout="center"],
|
||||||
|
.callout[data-callout="cent"] {
|
||||||
|
--callout-color: transparent !important;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.callout[data-callout="center"] .callout-title,
|
||||||
|
.callout[data-callout="cent"] .callout-title {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.callout[data-callout="center"] .callout-content blockquote,
|
||||||
|
.callout[data-callout="cent"] .callout-content blockquote {
|
||||||
|
border-right: var(--blockquote-border-thickness) solid
|
||||||
|
var(--blockquote-border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* transparent Callouts */
|
||||||
|
.callout[data-callout="transparent"],
|
||||||
|
.callout[data-callout="grid_transparent"] {
|
||||||
|
--callout-color: transparent;
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* gridlist Callouts */
|
||||||
|
.callout[data-callout="gridlist"] {
|
||||||
|
--callout-color: transparent;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
.callout[data-callout="gridlist"] .callout-title {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.callout[data-callout="gridlist"] .has-list-bullet li {
|
||||||
|
width: 48%;
|
||||||
|
padding: 10px;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
margin-left: 2%;
|
||||||
|
box-shadow: 0 0.5rem 1rem rgb(167 182 35 / 10%),
|
||||||
|
inset 0 -1px 0 rgb(0 0 0 / 17%);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* header Callouts */
|
||||||
|
.callout[data-callout*="header"] {
|
||||||
|
--callout-padding: 2px;
|
||||||
|
--callout-color: var(--callout-default);
|
||||||
|
--callout-icon: lucide-pencil;
|
||||||
|
|
||||||
|
background-color: rgba(var(--callout-color), 1) !important;
|
||||||
|
--callout-content-background: var(--primary-90) !important;
|
||||||
|
--callout-title-padding: 4px 12px;
|
||||||
|
--callout-radius: var(--radius-m);
|
||||||
|
--callout-title-text: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.callout[data-callout="abstract-header"],
|
||||||
|
.callout[data-callout="summary-header"],
|
||||||
|
.callout[data-callout="tldr-header"] {
|
||||||
|
--callout-color: var(--callout-summary);
|
||||||
|
--callout-icon: lucide-clipboard-list;
|
||||||
|
}
|
||||||
|
.callout[data-callout="info-header"] {
|
||||||
|
--callout-color: var(--callout-info);
|
||||||
|
--callout-icon: lucide-info;
|
||||||
|
}
|
||||||
|
.callout[data-callout="todo-header"] {
|
||||||
|
--callout-color: var(--callout-todo);
|
||||||
|
--callout-icon: lucide-check-circle-2;
|
||||||
|
}
|
||||||
|
.callout[data-callout="important-header"] {
|
||||||
|
--callout-color: var(--callout-important);
|
||||||
|
--callout-icon: lucide-flame;
|
||||||
|
}
|
||||||
|
.callout[data-callout="tip-header"],
|
||||||
|
.callout[data-callout="hint-header"] {
|
||||||
|
--callout-color: var(--callout-tip);
|
||||||
|
--callout-icon: lucide-flame;
|
||||||
|
}
|
||||||
|
.callout[data-callout="success-header"],
|
||||||
|
.callout[data-callout="check-header"],
|
||||||
|
.callout[data-callout="done-header"] {
|
||||||
|
--callout-color: var(--callout-success);
|
||||||
|
--callout-icon: lucide-check;
|
||||||
|
}
|
||||||
|
.callout[data-callout="question-header"],
|
||||||
|
.callout[data-callout="help-header"],
|
||||||
|
.callout[data-callout="faq-header"] {
|
||||||
|
--callout-color: var(--callout-question);
|
||||||
|
--callout-icon: help-circle;
|
||||||
|
}
|
||||||
|
.callout[data-callout="warning-header"],
|
||||||
|
.callout[data-callout="caution-header"],
|
||||||
|
.callout[data-callout="attention-header"] {
|
||||||
|
--callout-color: var(--callout-warning);
|
||||||
|
--callout-icon: lucide-alert-triangle;
|
||||||
|
}
|
||||||
|
.callout[data-callout="failure-header"],
|
||||||
|
.callout[data-callout="fail-header"],
|
||||||
|
.callout[data-callout="missing-header"] {
|
||||||
|
--callout-color: var(--callout-fail);
|
||||||
|
--callout-icon: lucide-x;
|
||||||
|
}
|
||||||
|
.callout[data-callout="danger-header"],
|
||||||
|
.callout[data-callout="error-header"] {
|
||||||
|
--callout-color: var(--callout-error);
|
||||||
|
--callout-icon: lucide-zap;
|
||||||
|
}
|
||||||
|
.callout[data-callout="bug-header"] {
|
||||||
|
--callout-color: var(--callout-bug);
|
||||||
|
--callout-icon: lucide-bug;
|
||||||
|
}
|
||||||
|
.callout[data-callout="example-header"] {
|
||||||
|
--callout-color: var(--callout-example);
|
||||||
|
--callout-icon: lucide-list;
|
||||||
|
}
|
||||||
|
.callout[data-callout="quote-header"],
|
||||||
|
.callout[data-callout="cite-header"] {
|
||||||
|
--callout-color: var(--callout-quote);
|
||||||
|
--callout-icon: quote-glyph;
|
||||||
|
}
|
||||||
|
|
||||||
|
.callout[data-callout="moon"] {
|
||||||
|
--callout-color: var(--callout-tip);
|
||||||
|
--callout-icon: lucide-sun-moon;
|
||||||
|
}
|
||||||
|
|
||||||
|
.callout[data-callout="author"] {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column-reverse;
|
||||||
|
--callout-icon: user;
|
||||||
|
--callout-color: var(--callout-quote);
|
||||||
|
}
|
||||||
|
.callout[data-callout="author"] > .callout-title {
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-end;
|
||||||
|
padding-right: 8px;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
.callout[data-callout="author"] .callout-content p {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.callout[data-callout="comment"] {
|
||||||
|
--callout-color: var(--callout-quote);
|
||||||
|
--callout-icon: message-square;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Folders Icons */
|
||||||
|
.nav-folder
|
||||||
|
.nav-folder-title-content:not(
|
||||||
|
div[data-path="/"] .nav-folder-title-content
|
||||||
|
)::before {
|
||||||
|
content: "";
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
width: 16px;
|
||||||
|
opacity: 0.8;
|
||||||
|
top: 0.15rem;
|
||||||
|
height: 16px;
|
||||||
|
margin-right: 5px;
|
||||||
|
background-color: var(--color-starred);
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-folder .nav-folder-title-content::before {
|
||||||
|
-webkit-mask-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-folder-plus"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"></path><line x1="12" y1="11" x2="12" y2="17"></line><line x1="9" y1="14" x2="15" y2="14"></line></svg>');
|
||||||
|
}
|
||||||
|
div[data-path="/"] .nav-folder-title-content {
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
div[data-path="/"] {
|
||||||
|
padding-top: 15px;
|
||||||
|
padding-bottom: 15px;
|
||||||
|
-webkit-text-stroke: 0.5px var(--text-stroke-color);
|
||||||
|
text-stroke: 0.5px var(--text-stroke-color);
|
||||||
|
--vault-name-color: var(--background-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ############################ */
|
||||||
|
/* Canvas */
|
||||||
|
/* ############################ */
|
||||||
|
.inline-embed > .canvas-minimap {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.canvas-submenu {
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mod-canvas-color-3.canvas-color-picker-item {
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
}
|
||||||
|
.mod-canvas-color-3.canvas-color-picker-item:hover::after {
|
||||||
|
content: "transparent";
|
||||||
|
position: absolute;
|
||||||
|
top: 100%;
|
||||||
|
background-color: #393939;
|
||||||
|
padding: 2px 4px;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
.mod-canvas-color-3 .canvas-node-container {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
.mod-canvas-color-3.is-selected,
|
||||||
|
.mod-canvas-color-3.is-focused {
|
||||||
|
--canvas-color: 245 192 36 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.canvas-node.is-selected .canvas-node-container,
|
||||||
|
.canvas-node.is-focused .canvas-node-container {
|
||||||
|
border-color: rgba(var(--canvas-color), 0.7);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ############################ */
|
||||||
|
/* Dataview plugin */
|
||||||
|
/* ############################ */
|
||||||
|
div.dataview-error-box {
|
||||||
|
transition: 0.2s all ease-in-out;
|
||||||
|
}
|
||||||
|
.markdown-source-view.mod-cm6 .cm-embed-block:hover {
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-source-view.mod-cm6 .cm-embed-block:hover div.dataview-error-box {
|
||||||
|
border-color: rgb(var(--muted-accent-rgb) / 14%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-view-table > thead > tr > th {
|
||||||
|
padding-bottom: 8px;
|
||||||
|
border-bottom: 2px solid var(--divider-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.callout[data-callout="gridlist"] .dataview.list-view-ul,
|
||||||
|
.callout[data-callout="gridlist"] .has-list-bullet {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.callout[data-callout="gridlist"] .dataview.list-view-ul li {
|
||||||
|
list-style: none;
|
||||||
|
border: 1px solid #a4a3a354;
|
||||||
|
border-radius: 10px;
|
||||||
|
text-align: center;
|
||||||
|
width: 48%;
|
||||||
|
padding: 10px;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
margin-right: 2%;
|
||||||
|
box-shadow: 0 0.5rem 1rem rgb(167 182 35 / 10%),
|
||||||
|
inset 0 -1px 0 rgb(0 0 0 / 17%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.callout[data-callout="gridlist"] .dataview.list-view-ul li span a {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dataview.dataview-ul.dataview-result-list-ul {
|
||||||
|
padding: 0;
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
.dataview.dataview-ul.dataview-result-list-ul li {
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Calendar Plugin */
|
||||||
|
.calendar.svelte-pcimu8 .active {
|
||||||
|
font-weight: bold;
|
||||||
|
--color-dot: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* meta-bind Plugin */
|
||||||
|
.mb-progress-bar-progress {
|
||||||
|
background: rgb(142, 141, 93);
|
||||||
|
}
|
||||||
|
input.metadata-input-text,
|
||||||
|
input[type="date"],
|
||||||
|
input[type="datetime-local"],
|
||||||
|
input[type="text"],
|
||||||
|
input[type="search"],
|
||||||
|
input[type="email"],
|
||||||
|
input[type="password"],
|
||||||
|
input[type="number"] {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.is-flashing,
|
||||||
|
.is-flashing .internal-link {
|
||||||
|
color: #000 !important;
|
||||||
|
}
|
||||||
7
.obsidian/themes/Terminal/manifest.json
vendored
Normal file
7
.obsidian/themes/Terminal/manifest.json
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"name": "Terminal",
|
||||||
|
"version": "1.0.5",
|
||||||
|
"minAppVersion": "1.0.0",
|
||||||
|
"author": "@Atlas",
|
||||||
|
"authorUrl": "https://github.com/zcysxy"
|
||||||
|
}
|
||||||
1575
.obsidian/themes/Terminal/theme.css
vendored
Normal file
1575
.obsidian/themes/Terminal/theme.css
vendored
Normal file
File diff suppressed because one or more lines are too long
8
.obsidian/themes/W95/manifest.json
vendored
Normal file
8
.obsidian/themes/W95/manifest.json
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"name": "W95",
|
||||||
|
"version": "1.1.0",
|
||||||
|
"minAppVersion": "1.2.8",
|
||||||
|
"author": "@phchang",
|
||||||
|
"authorUrl": "https://github.com/phchang",
|
||||||
|
"fundingUrl": "https://buymeacoffee.com/phchang"
|
||||||
|
}
|
||||||
768
.obsidian/themes/W95/theme.css
vendored
Normal file
768
.obsidian/themes/W95/theme.css
vendored
Normal file
@@ -0,0 +1,768 @@
|
|||||||
|
/* @settings
|
||||||
|
|
||||||
|
name: W95 Display Properties
|
||||||
|
id: w95-display-props
|
||||||
|
settings:
|
||||||
|
-
|
||||||
|
id: w95-display-props-font
|
||||||
|
title: Font
|
||||||
|
type: heading
|
||||||
|
level: 3
|
||||||
|
-
|
||||||
|
id: font-ui-smaller
|
||||||
|
title: Smaller font size (px)
|
||||||
|
type: variable-number
|
||||||
|
default: 11
|
||||||
|
format: px
|
||||||
|
-
|
||||||
|
id: font-ui-small
|
||||||
|
title: Small font size (px)
|
||||||
|
type: variable-number
|
||||||
|
default: 12
|
||||||
|
format: px
|
||||||
|
-
|
||||||
|
id: font-ui-medium
|
||||||
|
title: Medium font size (px)
|
||||||
|
type: variable-number
|
||||||
|
default: 14
|
||||||
|
format: px
|
||||||
|
-
|
||||||
|
id: font-ui-large
|
||||||
|
title: Large font size (px)
|
||||||
|
type: variable-number
|
||||||
|
default: 20
|
||||||
|
format: px
|
||||||
|
-
|
||||||
|
id: w95-display-theme
|
||||||
|
title: Appearance
|
||||||
|
type: heading
|
||||||
|
level: 3
|
||||||
|
-
|
||||||
|
id: w95-display-themes
|
||||||
|
title: Scheme
|
||||||
|
type: class-select
|
||||||
|
allowEmpty: false
|
||||||
|
default: w95-default
|
||||||
|
options:
|
||||||
|
-
|
||||||
|
label: W95 Standard
|
||||||
|
value: w95-default
|
||||||
|
-
|
||||||
|
label: Reactionary
|
||||||
|
value: w95-reactionary
|
||||||
|
-
|
||||||
|
label: Brick
|
||||||
|
value: w95-scheme-brick
|
||||||
|
-
|
||||||
|
label: Desert
|
||||||
|
value: w95-scheme-desert
|
||||||
|
-
|
||||||
|
label: Eggplant
|
||||||
|
value: w95-scheme-eggplant
|
||||||
|
-
|
||||||
|
label: Lilac
|
||||||
|
value: w95-scheme-lilac
|
||||||
|
-
|
||||||
|
label: Maple
|
||||||
|
value: w95-scheme-maple
|
||||||
|
-
|
||||||
|
label: Marine (high color)
|
||||||
|
value: w95-scheme-marine
|
||||||
|
-
|
||||||
|
label: Mystery
|
||||||
|
value: w95-scheme-mystery
|
||||||
|
-
|
||||||
|
label: Plum (high color)
|
||||||
|
value: w95-scheme-plum
|
||||||
|
-
|
||||||
|
label: Pumpkin
|
||||||
|
value: w95-scheme-pumpkin
|
||||||
|
-
|
||||||
|
label: Rainy Day
|
||||||
|
value: w95-scheme-rainy-day
|
||||||
|
-
|
||||||
|
label: Rose
|
||||||
|
value: w95-scheme-rose
|
||||||
|
-
|
||||||
|
label: Slate
|
||||||
|
value: w95-scheme-slate
|
||||||
|
-
|
||||||
|
label: Spruce
|
||||||
|
value: w95-scheme-spruce
|
||||||
|
-
|
||||||
|
label: Storm (VGA)
|
||||||
|
value: w95-scheme-storm
|
||||||
|
-
|
||||||
|
label: Teal (VGA)
|
||||||
|
value: w95-scheme-teal
|
||||||
|
-
|
||||||
|
label: Wheat
|
||||||
|
value: w95-scheme-wheat
|
||||||
|
*/
|
||||||
|
|
||||||
|
.theme-dark,
|
||||||
|
.theme-light {
|
||||||
|
--accent-h: 240;
|
||||||
|
--accent-s: 100%;
|
||||||
|
--accent-l: 24%;
|
||||||
|
|
||||||
|
--interactive-normal: var(--accent-1);
|
||||||
|
--interactive-hover: var(--accent-1);
|
||||||
|
--interactive-accent: var(--accent-6);
|
||||||
|
--interactive-accent-hover: var(--background-primary);
|
||||||
|
|
||||||
|
--background-primary: #bdbebd;
|
||||||
|
--background-secondary: #bdbebd;
|
||||||
|
--nav-item-background-active: #00007b;
|
||||||
|
--nav-item-color-active: var(--accent-1);
|
||||||
|
--scrollbar-track: var(--color-base-25);
|
||||||
|
--scrollbar-thumb: var(--color-base-20);
|
||||||
|
|
||||||
|
--border-highlight: var(--accent-1);
|
||||||
|
--border-shadow: var(--color-base-55);
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-dark.w95-scheme-rose,
|
||||||
|
.theme-light.w95-scheme-rose {
|
||||||
|
--background-primary: #cdaeb4;
|
||||||
|
--background-secondary: #cdaeb4;
|
||||||
|
|
||||||
|
--border-highlight: #e6d6de;
|
||||||
|
--border-shadow: #8a525c;
|
||||||
|
|
||||||
|
--scrollbar-track: #ead8df;
|
||||||
|
--scrollbar-thumb: #e6c6cc;
|
||||||
|
|
||||||
|
--nav-item-background-active: #9c5d6a;
|
||||||
|
--interactive-accent: #9c5d6a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-dark.w95-scheme-brick,
|
||||||
|
.theme-light.w95-scheme-brick {
|
||||||
|
--background-primary: #bdbea4;
|
||||||
|
--background-secondary: #bdbea4;
|
||||||
|
|
||||||
|
--border-highlight: #dedecd;
|
||||||
|
--border-shadow: #514e35;
|
||||||
|
|
||||||
|
--scrollbar-track: #d4d5c1;
|
||||||
|
--scrollbar-thumb: #d5d6ba;
|
||||||
|
|
||||||
|
--nav-item-background-active: #8b855a;
|
||||||
|
--interactive-accent: #8b855a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-dark.w95-scheme-desert,
|
||||||
|
.theme-light.w95-scheme-desert {
|
||||||
|
--background-primary: #d5cab5;
|
||||||
|
--background-secondary: #d5cab4;
|
||||||
|
|
||||||
|
--border-highlight: #e6e6de;
|
||||||
|
--border-shadow: #594d37;
|
||||||
|
|
||||||
|
--scrollbar-track: #e1dacc;
|
||||||
|
--scrollbar-thumb: #e6dcc8;
|
||||||
|
|
||||||
|
--nav-item-background-active: #007d7b;
|
||||||
|
--interactive-accent:;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-dark.w95-scheme-eggplant,
|
||||||
|
.theme-light.w95-scheme-eggplant {
|
||||||
|
--background-primary: #8baea4;
|
||||||
|
--background-secondary: #8baea4;
|
||||||
|
|
||||||
|
--border-highlight: #c5d6d5;
|
||||||
|
--border-shadow: #304943;
|
||||||
|
|
||||||
|
--scrollbar-track: #aec5be;
|
||||||
|
--scrollbar-thumb: #b1d6cc;
|
||||||
|
|
||||||
|
--nav-item-background-active: #527d73;
|
||||||
|
--interactive-accent: #527d73;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-dark.w95-scheme-lilac,
|
||||||
|
.theme-light.w95-scheme-lilac {
|
||||||
|
--background-primary: #aca5d6;
|
||||||
|
--background-secondary: #aca5d6;
|
||||||
|
|
||||||
|
--border-highlight: #d5d2ee;
|
||||||
|
--border-shadow: #3e3d45;
|
||||||
|
|
||||||
|
--scrollbar-track: #cdcae3;
|
||||||
|
--scrollbar-thumb: #bfb9e4;
|
||||||
|
|
||||||
|
--nav-item-background-active: #524cab;
|
||||||
|
--interactive-accent: #524cab;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-dark.w95-scheme-maple,
|
||||||
|
.theme-light.w95-scheme-maple {
|
||||||
|
--background-primary: #e6d6ac;
|
||||||
|
--background-secondary: #e6d6ac;
|
||||||
|
|
||||||
|
--border-highlight: #eeead5;
|
||||||
|
--border-shadow: #736026;
|
||||||
|
|
||||||
|
--scrollbar-track: #e4d7b1;
|
||||||
|
--scrollbar-thumb: #f1e2ba;
|
||||||
|
|
||||||
|
--nav-item-background-active: #c5a540;
|
||||||
|
--interactive-accent: #c5a540;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-dark.w95-scheme-marine,
|
||||||
|
.theme-light.w95-scheme-marine {
|
||||||
|
--background-primary: #83beb5;
|
||||||
|
--background-secondary: #83beb5;
|
||||||
|
|
||||||
|
--border-highlight: #c5dfd5;
|
||||||
|
--border-shadow: #7b8a84;
|
||||||
|
|
||||||
|
--scrollbar-track: #aad6d0;
|
||||||
|
--scrollbar-thumb: #9edcd2;
|
||||||
|
|
||||||
|
--nav-item-background-active: #00147b;
|
||||||
|
--interactive-accent: #00147b;
|
||||||
|
|
||||||
|
--background-editor-primary: #c5dfd5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-dark.w95-scheme-mystery,
|
||||||
|
.theme-light.w95-scheme-mystery {
|
||||||
|
--background-primary: #687868;
|
||||||
|
--background-secondary: #687868;
|
||||||
|
|
||||||
|
--border-highlight: #92a292;
|
||||||
|
--border-shadow: #414c41;
|
||||||
|
|
||||||
|
--scrollbar-track: #a1aea1;
|
||||||
|
--scrollbar-thumb: #859585;
|
||||||
|
|
||||||
|
--nav-item-background-active: #b77840;
|
||||||
|
--interactive-accent: #b77840;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-dark.w95-scheme-plum,
|
||||||
|
.theme-light.w95-scheme-plum {
|
||||||
|
--background-primary: #a4958b;
|
||||||
|
--background-secondary: #a4958b;
|
||||||
|
|
||||||
|
--border-highlight: #d5cec4;
|
||||||
|
--border-shadow: #d5cec4;
|
||||||
|
|
||||||
|
--scrollbar-track: #cac0b9;
|
||||||
|
--scrollbar-thumb: #bfb1a7;
|
||||||
|
|
||||||
|
--nav-item-background-active: #a4958b;
|
||||||
|
--interactive-accent: #a4958b;
|
||||||
|
|
||||||
|
--background-editor-primary: #a4958b;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-dark.w95-scheme-pumpkin,
|
||||||
|
.theme-light.w95-scheme-pumpkin {
|
||||||
|
--background-primary: #eed29c;
|
||||||
|
--background-secondary: #eed29c;
|
||||||
|
|
||||||
|
--border-highlight: #eed29c;
|
||||||
|
--border-shadow: #7c5e19;
|
||||||
|
|
||||||
|
--scrollbar-track: #f8e6c4;
|
||||||
|
--scrollbar-thumb: #f6dca9;
|
||||||
|
|
||||||
|
--nav-item-background-active: #7b157a;
|
||||||
|
--interactive-accent: #7b157a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-dark.w95-scheme-rainy-day,
|
||||||
|
.theme-light.w95-scheme-rainy-day {
|
||||||
|
--background-primary: #7b95ac;
|
||||||
|
--background-secondary: #7b95ac;
|
||||||
|
|
||||||
|
--border-highlight: #bdcad5;
|
||||||
|
--border-shadow: #4a617b;
|
||||||
|
|
||||||
|
--scrollbar-track: #b0c2d3;
|
||||||
|
--scrollbar-thumb: #9ab4cc;
|
||||||
|
|
||||||
|
--nav-item-background-active: #4a617b;
|
||||||
|
--interactive-accent: #4a617b;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-dark.w95-scheme-slate,
|
||||||
|
.theme-light.w95-scheme-slate {
|
||||||
|
--background-primary: #9cb6c5;
|
||||||
|
--background-secondary: #9cb6c5;
|
||||||
|
|
||||||
|
--border-highlight: #cddade;
|
||||||
|
--border-shadow: #527d94;
|
||||||
|
|
||||||
|
--scrollbar-track: #c6d6df;
|
||||||
|
--scrollbar-thumb: #b2cad8;
|
||||||
|
|
||||||
|
--nav-item-background-active: #527d94;
|
||||||
|
--interactive-accent: #527d94;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-dark.w95-scheme-spruce,
|
||||||
|
.theme-light.w95-scheme-spruce {
|
||||||
|
--background-primary: #9cc6a4;
|
||||||
|
--background-secondary: #9cc6a4;
|
||||||
|
|
||||||
|
--border-highlight: #cde2cd;
|
||||||
|
--border-shadow: #529562;
|
||||||
|
|
||||||
|
--scrollbar-track: #bfd8c4;
|
||||||
|
--scrollbar-thumb: #b3d8ba;
|
||||||
|
|
||||||
|
--nav-item-background-active: #529562;
|
||||||
|
--interactive-accent: #529562;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-dark.w95-scheme-storm,
|
||||||
|
.theme-light.w95-scheme-storm {
|
||||||
|
--background-primary: #bdbebd;
|
||||||
|
--background-secondary: #bdbebd;
|
||||||
|
|
||||||
|
--border-highlight: #ffffff;
|
||||||
|
--border-shadow: #7b7d7b;
|
||||||
|
|
||||||
|
--scrollbar-track: #dedfde;
|
||||||
|
--scrollbar-thumb: #cbcccb;
|
||||||
|
|
||||||
|
--nav-item-background-active: #7b157a;
|
||||||
|
--interactive-accent: #7b157a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-dark.w95-scheme-teal,
|
||||||
|
.theme-light.w95-scheme-teal {
|
||||||
|
--background-primary: #bdbebd;
|
||||||
|
--background-secondary: #bdbebd;
|
||||||
|
|
||||||
|
--border-highlight: #ffffff;
|
||||||
|
--border-shadow: #7b7d7b;
|
||||||
|
|
||||||
|
--scrollbar-track: #dedfde;
|
||||||
|
--scrollbar-thumb: #cbcccb;
|
||||||
|
|
||||||
|
--nav-item-background-active: #0b7d7b;
|
||||||
|
--interactive-accent: #0b7d7b;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-dark.w95-scheme-wheat,
|
||||||
|
.theme-light.w95-scheme-wheat {
|
||||||
|
--background-primary: #dede9c;
|
||||||
|
--background-secondary: #dede9c;
|
||||||
|
|
||||||
|
--border-highlight: #eeeecd;
|
||||||
|
--border-shadow: #bdba39;
|
||||||
|
|
||||||
|
--scrollbar-track: #dede9c;
|
||||||
|
--scrollbar-thumb: #dede9c;
|
||||||
|
|
||||||
|
--nav-item-background-active: #7b7d00;
|
||||||
|
--interactive-accent: #7b7d00;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-dark.w95-reactionary,
|
||||||
|
.theme-light.w95-reactionary {
|
||||||
|
--background-primary: #d4d0c8;
|
||||||
|
--background-secondary: #d4d0c8;
|
||||||
|
|
||||||
|
--text-normal: #181612;
|
||||||
|
|
||||||
|
--nav-item-background-active: #3a6ea5;
|
||||||
|
--nav-item-color-active: var(--accent-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-dark,
|
||||||
|
.theme-light {
|
||||||
|
color-scheme: light;
|
||||||
|
--highlight-mix-blend-mode: darken;
|
||||||
|
--mono-rgb-0: 255, 255, 255;
|
||||||
|
--mono-rgb-100: 0, 0, 0;
|
||||||
|
--color-red-rgb: 233, 49, 71;
|
||||||
|
--color-red: #e93147;
|
||||||
|
--color-orange-rgb: 236, 117, 0;
|
||||||
|
--color-orange: #ec7500;
|
||||||
|
--color-yellow-rgb: 224, 172, 0;
|
||||||
|
--color-yellow: #e0ac00;
|
||||||
|
--color-green-rgb: 8, 185, 78;
|
||||||
|
--color-green: #08b94e;
|
||||||
|
--color-cyan-rgb: 0, 191, 188;
|
||||||
|
--color-cyan: #00bfbc;
|
||||||
|
--color-blue-rgb: 8, 109, 221;
|
||||||
|
--color-blue: #086ddd;
|
||||||
|
--color-purple-rgb: 120, 82, 238;
|
||||||
|
--color-purple: #7852ee;
|
||||||
|
--color-pink-rgb: 213, 57, 132;
|
||||||
|
--color-pink: #d53984;
|
||||||
|
--color-base-00: #ffffff;
|
||||||
|
--color-base-05: #fcfcfc;
|
||||||
|
--color-base-10: #fafafa;
|
||||||
|
--color-base-20: #f6f6f6;
|
||||||
|
--color-base-25: #e3e3e3;
|
||||||
|
--color-base-30: #e0e0e0;
|
||||||
|
--color-base-35: #d4d4d4;
|
||||||
|
--color-base-40: #bdbdbd;
|
||||||
|
--color-base-50: #ababab;
|
||||||
|
--color-base-55: #808080;
|
||||||
|
--color-base-60: #707070;
|
||||||
|
--color-base-70: #5c5c5c;
|
||||||
|
--color-base-100: #222222;
|
||||||
|
--color-accent-hsl: var(--accent-h), var(--accent-s), var(--accent-l);
|
||||||
|
--color-accent: hsl(var(--accent-h), var(--accent-s), var(--accent-l));
|
||||||
|
--color-accent-1: hsl(calc(var(--accent-h) - 1), calc(var(--accent-s) * 1.01), calc(var(--accent-l) * 1.075));
|
||||||
|
--color-accent-2: hsl(calc(var(--accent-h) - 3), calc(var(--accent-s) * 1.02), calc(var(--accent-l) * 1.15));
|
||||||
|
--background-secondary-alt: var(--color-base-05);
|
||||||
|
--background-modifier-box-shadow: rgba(0, 0, 0, 0.1);
|
||||||
|
--background-modifier-cover: rgba(220, 220, 220, 0.4);
|
||||||
|
--input-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.12),
|
||||||
|
0 2px 3px 0 rgba(0, 0, 0, .05),
|
||||||
|
0 1px 1.5px 0 rgba(0, 0, 0, .03),
|
||||||
|
0 1px 2px 0 rgba(0, 0, 0, .04),
|
||||||
|
0 0 0 0 transparent;
|
||||||
|
--input-shadow-hover: inset 0 0 0 1px rgba(0, 0, 0, 0.17),
|
||||||
|
0 2px 3px 0 rgba(0, 0, 0, .1),
|
||||||
|
0 1px 1.5px 0 rgba(0, 0, 0, .03),
|
||||||
|
0 1px 2px 0 rgba(0, 0, 0, .04),
|
||||||
|
0 0 0 0 transparent;
|
||||||
|
--shadow-s: 0px 1px 2px rgba(0, 0, 0, 0.028),
|
||||||
|
0px 3.4px 6.7px rgba(0, 0, 0, .042),
|
||||||
|
0px 15px 30px rgba(0, 0, 0, .07);
|
||||||
|
--shadow-l: 0px 1.8px 7.3px rgba(0, 0, 0, 0.071),
|
||||||
|
0px 6.3px 24.7px rgba(0, 0, 0, 0.112),
|
||||||
|
0px 30px 90px rgba(0, 0, 0, 0.2);
|
||||||
|
|
||||||
|
--accent-1: #FFFFFF;
|
||||||
|
--accent-2: #00FFFF;
|
||||||
|
--accent-3: #00FF00;
|
||||||
|
--accent-4: #FFFF00;
|
||||||
|
--accent-5: #FF0000;
|
||||||
|
--accent-6: #00007b;
|
||||||
|
|
||||||
|
--accent-1-muted: #ff79c6;
|
||||||
|
--accent-2-muted: #8be9fd;
|
||||||
|
--accent-3-muted: #50fa7b;
|
||||||
|
--accent-4-muted: #ffb86c;
|
||||||
|
--accent-5-muted: #ff5555;
|
||||||
|
--accent-6-muted: #bd93f9;
|
||||||
|
|
||||||
|
--header-color: #34548a;
|
||||||
|
--bold-color: #000000;
|
||||||
|
--italic-color: #343b58;
|
||||||
|
--text-highlight-bg: #485e3066;
|
||||||
|
--text-faint: #4f5057;
|
||||||
|
|
||||||
|
--background-editor-primary: #ffffff;
|
||||||
|
|
||||||
|
--nav-files-background: var(--background-editor-primary);
|
||||||
|
|
||||||
|
--indentation-guide-color: rgba(var(--mono-rgb-100), 0.4);
|
||||||
|
|
||||||
|
/* Backgrounds */
|
||||||
|
--background-modifier-border: var(--color-base-60);
|
||||||
|
--background-modifier-border-hover: var(--background-primary);
|
||||||
|
--background-modifier-border-focus: var(--background-primary);
|
||||||
|
--ribbon-background: var(--background-primary);
|
||||||
|
--code-background: var(--accent-1);
|
||||||
|
|
||||||
|
/* editor */
|
||||||
|
|
||||||
|
/* Normalize title bar colors */
|
||||||
|
--tab-container-background: var(--background-primary);
|
||||||
|
--titlebar-background: var(--background-primary);
|
||||||
|
--titlebar-background-focused: var(--background-primary);
|
||||||
|
|
||||||
|
/* Graph adjustments */
|
||||||
|
--graph-line: var(--background-primary, var(--background-modifier-border-focus));
|
||||||
|
|
||||||
|
/* UI font colors */
|
||||||
|
--h1-color: var(--header-color);
|
||||||
|
--h2-color: var(--header-color);
|
||||||
|
--h3-color: var(--header-color);
|
||||||
|
--h4-color: var(--header-color);
|
||||||
|
--h5-color: var(--header-color);
|
||||||
|
--h6-color: var(--header-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
/* Font sizes */
|
||||||
|
--header-size: 1.4rem;
|
||||||
|
--h1-size: var(--header-size);
|
||||||
|
--h2-size: 1.3rem;
|
||||||
|
--h3-size: 1.2rem;
|
||||||
|
--h4-size: 1.1rem;
|
||||||
|
--h5-size: 1rem;
|
||||||
|
--h6-size: 0.9rem;
|
||||||
|
|
||||||
|
/* UI font sizes */
|
||||||
|
--font-ui-smaller: 11px;
|
||||||
|
--font-ui-small: 12px;
|
||||||
|
--font-ui-medium: 14px;
|
||||||
|
--font-ui-large: 20px;
|
||||||
|
|
||||||
|
/* tabs */
|
||||||
|
--tab-radius-active: 1px;
|
||||||
|
--tab-curve: 1px;
|
||||||
|
|
||||||
|
/* buttons */
|
||||||
|
--clickable-icon-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
button,
|
||||||
|
button.mod-cta,
|
||||||
|
button:not(.clickable-icon) {
|
||||||
|
background-color: var(--background-primary);
|
||||||
|
border: 2px outset var(--color-base-30);
|
||||||
|
border-radius: 0;
|
||||||
|
color: var(--color-base-100);
|
||||||
|
}
|
||||||
|
|
||||||
|
button:active,
|
||||||
|
button.mod-cta:active {
|
||||||
|
background-color: var(--background-primary);
|
||||||
|
border: 2px inset var(--color-base-30);
|
||||||
|
border-radius: 0;
|
||||||
|
color: var(--color-base-100);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
select.dropdown {
|
||||||
|
border-radius: 0;
|
||||||
|
border: 2px inset var(--color-base-30);
|
||||||
|
}
|
||||||
|
|
||||||
|
.clickable-icon {
|
||||||
|
border-top: 1px solid var(--border-highlight);
|
||||||
|
border-left: 1px solid var(--border-highlight);
|
||||||
|
border-right: 1px solid var(--border-shadow);
|
||||||
|
border-bottom: 1px solid var(--border-shadow);
|
||||||
|
}
|
||||||
|
|
||||||
|
.clickable-icon:active {
|
||||||
|
border-top: 1px solid var(--border-shadow);
|
||||||
|
border-left: 1px solid var(--border-shadow);
|
||||||
|
border-right: 1px solid var(--border-highlight);
|
||||||
|
border-bottom: 1px solid var(--border-highlight);
|
||||||
|
}
|
||||||
|
|
||||||
|
.clickable-icon::before {
|
||||||
|
content: ' ';
|
||||||
|
}
|
||||||
|
|
||||||
|
.side-dock-settings,
|
||||||
|
.side-dock-actions {
|
||||||
|
gap: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-tab-container .view-header {}
|
||||||
|
|
||||||
|
.workspace-tab-container .view-header-title-container {
|
||||||
|
height: var(--header-height);
|
||||||
|
}
|
||||||
|
|
||||||
|
.mod-right-split .workspace-tab-header-container-inner,
|
||||||
|
.mod-left-split .workspace-tab-header-container-inner {
|
||||||
|
gap: 0;
|
||||||
|
margin-left:1rem;
|
||||||
|
}
|
||||||
|
.mod-right-split .workspace-tab-header,
|
||||||
|
.mod-left-split .workspace-tab-header {
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mod-right-split .workspace-tab-header,
|
||||||
|
.mod-left-split .workspace-tab-header {
|
||||||
|
border-top: 1px solid var(--border-highlight);
|
||||||
|
border-left: 1px solid var(--border-highlight);
|
||||||
|
border-right: 1px solid var(--border-shadow);
|
||||||
|
border-bottom: 1px solid var(--border-shadow);
|
||||||
|
color: var(--tab-text-color-active);
|
||||||
|
background-color: var(--tab-background-active);
|
||||||
|
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mod-right-split .workspace-tab-header.is-active,
|
||||||
|
.mod-left-split .workspace-tab-header.is-active {
|
||||||
|
border-top: 1px solid var(--tab-outline-color);
|
||||||
|
border-left: 1px solid var(--tab-outline-color);
|
||||||
|
border-bottom: 1px solid #FFFFFF;
|
||||||
|
border-right: 1px solid var(--color-base-20);
|
||||||
|
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
.mod-right-split .workspace-tab-header.is-active .workspace-tab-header-inner,
|
||||||
|
.mod-left-split .workspace-tab-header.is-active .workspace-tab-header-inner {
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mod-root .workspace-tab-header:not(.is-active) {
|
||||||
|
top: 3px;
|
||||||
|
border-top: 1px solid var(--border-highlight);
|
||||||
|
border-left: 1px solid var(--border-highlight);
|
||||||
|
border-right: 1px solid var(--border-shadow);
|
||||||
|
border-right: 1px solid var(--border-shadow);
|
||||||
|
color: var(--tab-text-color-active);
|
||||||
|
}
|
||||||
|
|
||||||
|
.mod-root .workspace-tab-header :not(.is-active) * {
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mod-root .workspace-tab-header-inner::after {
|
||||||
|
background: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-tab-header {
|
||||||
|
align-items: center;
|
||||||
|
border-radius: var(--tab-radius) var(--tab-radius) 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-tab-header-inner {
|
||||||
|
margin: 1px 0;
|
||||||
|
border-radius: var(--tab-radius) var(--tab-radius) 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-tab-header.is-active .workspace-tab-header-inner {
|
||||||
|
border: 1px dotted var(--color-base-70);
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-tab-header-container {
|
||||||
|
display: flex;
|
||||||
|
background-color: var(--tab-container-background);
|
||||||
|
height: var(--header-height);
|
||||||
|
border-bottom: var(--tab-outline-width) solid var(--border-highlight);
|
||||||
|
flex: 0 0 auto;
|
||||||
|
padding-left: 0;
|
||||||
|
padding-right: var(--size-4-2);
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-ribbon {
|
||||||
|
border-right: var(--divider-width) solid var(--border-shadow);
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-ribbon.mod-left:before {
|
||||||
|
border-bottom: 1px solid var(--accent-1);
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-tab-header.is-active {
|
||||||
|
border-top: 1px solid var(--border-highlight);
|
||||||
|
border-left: 1px solid var(--border-highlight);
|
||||||
|
box-shadow: 1px 1px 0 var(--tab-outline-width) var(--tab-outline-color);
|
||||||
|
color: var(--tab-text-color-active);
|
||||||
|
background-color: var(--tab-background-active);
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-resize-handle {
|
||||||
|
opacity: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-tabs .workspace-leaf .view-content {
|
||||||
|
background-color: var(--background-editor-primary);
|
||||||
|
border: 4px ridge var(--border-highlight);
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-action-button:active {}
|
||||||
|
|
||||||
|
.nav-header {
|
||||||
|
height: var(--header-height);
|
||||||
|
/* todo: make this more dynamic */
|
||||||
|
background-color: var(--background-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.mod-left-split .nav-header {
|
||||||
|
border-left: var(--divider-width) solid var(--border-highlight);
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-files-container {
|
||||||
|
background-color: var(--nav-files-background);
|
||||||
|
border: 4px ridge var(--border-highlight);
|
||||||
|
border-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-buttons-container {
|
||||||
|
padding: 0;
|
||||||
|
gap: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.inline-title {
|
||||||
|
font-size: 2rem;
|
||||||
|
font-family: system-ui, Helvetica, Arial, sans-serif;
|
||||||
|
background-color: #000;
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tree-item-self.is-being-renamed:focus-within {
|
||||||
|
color: var(--tab-text-color-active);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* vault switcher */
|
||||||
|
.workspace-sidedock-vault-profile {
|
||||||
|
border-left: 1px solid var(--border-highlight);
|
||||||
|
border-bottom: 1px solid var(--border-shadow);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* scroll bar */
|
||||||
|
::-webkit-scrollbar {
|
||||||
|
width: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-track {
|
||||||
|
background-color: var(--scrollbar-track);
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-thumb {
|
||||||
|
border: 2px outset var(--scrollbar-thumb);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* status bar */
|
||||||
|
.status-bar {
|
||||||
|
position: inherit;
|
||||||
|
border-radius: 0;
|
||||||
|
border-style: none;
|
||||||
|
border-width: 0;
|
||||||
|
background-color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-folder.mod-root .nav-folder>.nav-folder-children {
|
||||||
|
border-left: var(--nav-indentation-guide-width) dotted var(--nav-indentation-guide-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-close-button {
|
||||||
|
margin-right: 0.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* search results */
|
||||||
|
.search-result:not(.is-collapsed) .search-result-file-title {
|
||||||
|
color: var(--nav-item-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* mobile */
|
||||||
|
|
||||||
|
.is-mobile .workspace-drawer.mod-left {
|
||||||
|
border-right: 1px outset var(--color-base-60);
|
||||||
|
}
|
||||||
|
|
||||||
|
.is-mobile .workspace-drawer.mod-right {
|
||||||
|
border-left: 1px outset var(--color-base-60);
|
||||||
|
}
|
||||||
|
|
||||||
|
.is-mobile .nav-files-container {
|
||||||
|
border: 4px ridge var(--color-base-25);
|
||||||
|
}
|
||||||
|
|
||||||
|
.is-mobile .empty-state-action {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.is-mobile .workspace-drawer-inner {
|
||||||
|
padding-bottom: var(--safe-area-inset-bottom);
|
||||||
|
}
|
||||||
143
.obsidian/workspace.json
vendored
143
.obsidian/workspace.json
vendored
@@ -4,39 +4,24 @@
|
|||||||
"type": "split",
|
"type": "split",
|
||||||
"children": [
|
"children": [
|
||||||
{
|
{
|
||||||
"id": "a4945c2f40dfd230",
|
"id": "70040d3480c4df8e",
|
||||||
"type": "tabs",
|
"type": "tabs",
|
||||||
"children": [
|
"children": [
|
||||||
{
|
{
|
||||||
"id": "ec35ad1ba6900d85",
|
"id": "43ea8ee768c9bbae",
|
||||||
"type": "leaf",
|
|
||||||
"state": {
|
|
||||||
"type": "split-diff-view",
|
|
||||||
"state": {
|
|
||||||
"aFile": ".obsidian/workspace.json",
|
|
||||||
"bFile": ".obsidian/workspace.json",
|
|
||||||
"aRef": ""
|
|
||||||
},
|
|
||||||
"icon": "diff",
|
|
||||||
"title": "Diff: workspace.json"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "cfc8c132370ad11d",
|
|
||||||
"type": "leaf",
|
"type": "leaf",
|
||||||
"state": {
|
"state": {
|
||||||
"type": "markdown",
|
"type": "markdown",
|
||||||
"state": {
|
"state": {
|
||||||
"file": "conflict-files-obsidian-git.md",
|
"file": "Documentación personal/Proyectos/LilCMS/JS_Version/Producción/v0.0.1/LilCMS.JS - v0.0.1 - Notas de versión.md",
|
||||||
"mode": "source",
|
"mode": "source",
|
||||||
"source": false
|
"source": false
|
||||||
},
|
},
|
||||||
"icon": "lucide-file",
|
"icon": "lucide-file",
|
||||||
"title": "conflict-files-obsidian-git"
|
"title": "LilCMS.JS - v0.0.1 - Notas de versión"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
]
|
||||||
"currentTab": 1
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"direction": "vertical"
|
"direction": "vertical"
|
||||||
@@ -93,7 +78,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"direction": "horizontal",
|
"direction": "horizontal",
|
||||||
"width": 317.5
|
"width": 252.5
|
||||||
},
|
},
|
||||||
"right": {
|
"right": {
|
||||||
"id": "519d5773673c1040",
|
"id": "519d5773673c1040",
|
||||||
@@ -102,6 +87,7 @@
|
|||||||
{
|
{
|
||||||
"id": "ec141e7a66dc7ec8",
|
"id": "ec141e7a66dc7ec8",
|
||||||
"type": "tabs",
|
"type": "tabs",
|
||||||
|
"dimension": 54.131355932203384,
|
||||||
"children": [
|
"children": [
|
||||||
{
|
{
|
||||||
"id": "5a14f2340b0f216e",
|
"id": "5a14f2340b0f216e",
|
||||||
@@ -109,7 +95,7 @@
|
|||||||
"state": {
|
"state": {
|
||||||
"type": "backlink",
|
"type": "backlink",
|
||||||
"state": {
|
"state": {
|
||||||
"file": "Documentación personal/Mecanica de Unix/1. Bash Scripting Avanzado/Funciones puras.md",
|
"file": "BDD/SQL/Apuntes generales de SQL.md",
|
||||||
"collapseAll": false,
|
"collapseAll": false,
|
||||||
"extraContext": false,
|
"extraContext": false,
|
||||||
"sortOrder": "alphabetical",
|
"sortOrder": "alphabetical",
|
||||||
@@ -119,7 +105,7 @@
|
|||||||
"unlinkedCollapsed": true
|
"unlinkedCollapsed": true
|
||||||
},
|
},
|
||||||
"icon": "links-coming-in",
|
"icon": "links-coming-in",
|
||||||
"title": "Enlaces entrantes de Funciones puras"
|
"title": "Enlaces entrantes de Apuntes generales de SQL"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -151,21 +137,6 @@
|
|||||||
"title": "Todas las propiedades"
|
"title": "Todas las propiedades"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"id": "b786a3cab1b9744b",
|
|
||||||
"type": "leaf",
|
|
||||||
"state": {
|
|
||||||
"type": "outline",
|
|
||||||
"state": {
|
|
||||||
"file": "Documentación personal/Mecanica de Unix/1. Bash Scripting Avanzado/Funciones puras/Funciones puras.md",
|
|
||||||
"followCursor": false,
|
|
||||||
"showSearch": false,
|
|
||||||
"searchQuery": ""
|
|
||||||
},
|
|
||||||
"icon": "lucide-list",
|
|
||||||
"title": "Esquema de Funciones puras"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"id": "e615f9321ff830be",
|
"id": "e615f9321ff830be",
|
||||||
"type": "leaf",
|
"type": "leaf",
|
||||||
@@ -182,16 +153,16 @@
|
|||||||
"state": {
|
"state": {
|
||||||
"type": "outgoing-link",
|
"type": "outgoing-link",
|
||||||
"state": {
|
"state": {
|
||||||
"file": "Documentación personal/Mecanica de Unix/1. Bash Scripting Avanzado/Funciones puras/Funciones puras.md",
|
"file": "BDD/SQL/Apuntes generales de SQL.md",
|
||||||
"linksCollapsed": false,
|
"linksCollapsed": false,
|
||||||
"unlinkedCollapsed": true
|
"unlinkedCollapsed": true
|
||||||
},
|
},
|
||||||
"icon": "links-going-out",
|
"icon": "links-going-out",
|
||||||
"title": "Enlaces salientes de Funciones puras"
|
"title": "Enlaces salientes de Apuntes generales de SQL"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "ad0b933ded8362ff",
|
"id": "f680d743f846f5b9",
|
||||||
"type": "leaf",
|
"type": "leaf",
|
||||||
"state": {
|
"state": {
|
||||||
"type": "graph",
|
"type": "graph",
|
||||||
@@ -199,13 +170,29 @@
|
|||||||
"icon": "lucide-git-fork",
|
"icon": "lucide-git-fork",
|
||||||
"title": "Vista gráfica"
|
"title": "Vista gráfica"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "3cca92a09a04b814",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "outline",
|
||||||
|
"state": {
|
||||||
|
"file": "Documentación personal/Proyectos/LilCMS/JS_Version/LilCMS.JS - Concepto.md",
|
||||||
|
"followCursor": false,
|
||||||
|
"showSearch": false,
|
||||||
|
"searchQuery": ""
|
||||||
|
},
|
||||||
|
"icon": "lucide-list",
|
||||||
|
"title": "Esquema de LilCMS.JS - Concepto"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"currentTab": 4
|
"currentTab": 3
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "7ac2f57f0d4937ed",
|
"id": "7ac2f57f0d4937ed",
|
||||||
"type": "tabs",
|
"type": "tabs",
|
||||||
|
"dimension": 45.868644067796616,
|
||||||
"children": [
|
"children": [
|
||||||
{
|
{
|
||||||
"id": "f3844ce27366e01c",
|
"id": "f3844ce27366e01c",
|
||||||
@@ -221,7 +208,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"direction": "horizontal",
|
"direction": "horizontal",
|
||||||
"width": 408.5
|
"width": 242.5
|
||||||
},
|
},
|
||||||
"left-ribbon": {
|
"left-ribbon": {
|
||||||
"hiddenItems": {
|
"hiddenItems": {
|
||||||
@@ -235,44 +222,45 @@
|
|||||||
"obsidian-git:Open Git source control": false
|
"obsidian-git:Open Git source control": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"active": "cfc8c132370ad11d",
|
"active": "43ea8ee768c9bbae",
|
||||||
"lastOpenFiles": [
|
"lastOpenFiles": [
|
||||||
"conflict-files-obsidian-git.md",
|
"Documentación personal/Proyectos/LilCMS/JS_Version/Producción/v0.0.1/LilCMS.JS - v0.0.1 - Notas técnicas de versión.md",
|
||||||
"Servidores/M5/Actividades/RA2/RA2 \"Instal·la programari de propòsit general avaluant-ne lescaracterístiques i els entorns d’aplicació. Instal·lació de programarid’utilitat i propòsit general per a un sistema informàtic\".md",
|
"Documentación personal/Proyectos/LilCMS/JS_Version/Producción/v0.0.1/LilCMS.JS - v0.0.1 - Notas de versión.md",
|
||||||
"Servidores/M5/Actividades",
|
"Documentación personal/Proyectos/LilCMS/JS_Version/Conceptos/LilCMS.JS - Concepto.md",
|
||||||
"README.md",
|
"Documentación personal/Proyectos/LilCMS/JS_Version/Producción/v0.0.1",
|
||||||
"Servidores/M5/Actividades/RA2",
|
"Documentación personal/Proyectos/LilCMS/JS_Version/Producción",
|
||||||
"Servidores/M5/x.md",
|
"Documentación personal/Proyectos/LilCMS/JS_Version/Conceptos",
|
||||||
|
"BDD/SQL/Apuntes generales de SQL.md",
|
||||||
|
"BDD/SQL/Tecnicismos/Tipos de datos.md",
|
||||||
|
"Documentación personal/Proyectos/LilCMS/JS_Version",
|
||||||
|
"Documentación personal/Proyectos/LilCMS",
|
||||||
|
"Documentación personal/Proyectos",
|
||||||
"Documentación personal/Mecanica de Unix/1. Bash Scripting Avanzado/Funciones puras/Ejercicios/Ejercicios - Funciones puras.md",
|
"Documentación personal/Mecanica de Unix/1. Bash Scripting Avanzado/Funciones puras/Ejercicios/Ejercicios - Funciones puras.md",
|
||||||
"Documentación personal/Mecanica de Unix/1. Bash Scripting Avanzado/Funciones puras/Funciones puras.md",
|
"Imagenes/SQL/Mezcla-cartesiana_(CROSS_JOIN).png",
|
||||||
"Documentación personal/Mecanica de Unix/1. Bash Scripting Avanzado/Funciones puras/Ejercicios/calculadora_modular.sh",
|
"Imagenes/SQL",
|
||||||
"Documentación personal/Mecanica de Unix/1. Bash Scripting Avanzado/Funciones puras/Ejercicios",
|
"Imagenes",
|
||||||
"Documentación personal/Mecanica de Unix/1. Bash Scripting Avanzado/Funciones puras",
|
"BDD/SQL/Uso general/Importación y exportación de base de datos.md",
|
||||||
|
"BDD/SQL/SQL.md",
|
||||||
|
"BDD/SQL/Uso general",
|
||||||
|
"BDD/SQL/Tecnicismos/Disparadores.md",
|
||||||
|
"BDD/SQL/Tecnicismos",
|
||||||
|
"BDD/SQL/Tecnicismos/Lenguaje de definición de datos (DDL).md",
|
||||||
|
"BDD/SQL/Tecnicismos/Lenguaje de Manupulación de Datos (DML).md",
|
||||||
|
"BDD/SQL/Tecnicismos/Procedimientos almacenados.md",
|
||||||
|
"BDD/SQL/Tecnicismos/Sintaxis (Keywords).md",
|
||||||
|
"README.md",
|
||||||
|
"Documentación personal/Mecanica de Unix/1. Bash Scripting Avanzado/Extra.md",
|
||||||
"Documentación personal/Mecanica de Unix/Mecánica Unix - Manejo de la shell.md",
|
"Documentación personal/Mecanica de Unix/Mecánica Unix - Manejo de la shell.md",
|
||||||
"Documentación personal/Mecanica de Unix/1. Bash Scripting Avanzado/Expansión de parámetros.md",
|
"Documentación personal/Mecanica de Unix/1. Bash Scripting Avanzado/Funciones puras/Funciones puras.md",
|
||||||
"Documentación personal/Mecanica de Unix/1. Bash Scripting Avanzado/Patrones de diseño en Bash.md",
|
|
||||||
"Documentación personal/Mecanica de Unix/1. Bash Scripting Avanzado/Procesos hijos y paralelismo.md",
|
|
||||||
"Documentación personal/Mecanica de Unix/1. Bash Scripting Avanzado/Seguridad en scripts.md",
|
|
||||||
"Documentación personal/Mecanica de Unix/1. Bash Scripting Avanzado/Señales.md",
|
|
||||||
"Documentación personal/Mecanica de Unix/1. Bash Scripting Avanzado/Subshells.md",
|
|
||||||
"Documentación personal/Mecanica de Unix/1. Bash Scripting Avanzado/Trampas (traps).md",
|
|
||||||
"Documentación personal/Mecanica de Unix/1. Bash Scripting Avanzado/Arrays asociativos.md",
|
"Documentación personal/Mecanica de Unix/1. Bash Scripting Avanzado/Arrays asociativos.md",
|
||||||
"Documentación personal/Mecanica de Unix/2. awk-sed-grep/Manipulación de CSV, JSON simplificado, logs de sistemas.md",
|
|
||||||
"Documentación personal/Mecanica de Unix/2. awk-sed-grep/Creación de mini-lenguajes personalizados.md",
|
|
||||||
"Documentación personal/Mecanica de Unix/2. awk-sed-grep/Reescritura de texto.md",
|
|
||||||
"Documentación personal/Mecanica de Unix/2. awk-sed-grep/Extracción de datos estructurados.md",
|
|
||||||
"Documentación personal/Mecanica de Unix/2. awk-sed-grep/Parsing avanzado de logs.md",
|
|
||||||
"Documentación personal/Mecanica de Unix/2. awk-sed-grep",
|
|
||||||
"Sin título.base",
|
|
||||||
"2025-12-08.md",
|
|
||||||
"Documentación personal/Mecanica de Unix/Bash Scripting/Fundamentos de Bash.md",
|
|
||||||
"Documentación personal/Mecanica de Unix/Bash Scripting/Sin nombre",
|
|
||||||
"Documentación personal/Lenguajes de programación absurdos",
|
|
||||||
"BDD/SQL/Importación y exportación de base de datos.md",
|
|
||||||
"Documentación personal/Mecanica de Unix/Bash Scripting/s.md",
|
|
||||||
"Documentación personal/Mecanica de Unix/1. Bash Scripting Avanzado",
|
|
||||||
"BDD/SQL/Diario/Clase 4 de diciembre.md",
|
"BDD/SQL/Diario/Clase 4 de diciembre.md",
|
||||||
"BDD/SQL/Lenguaje de Manupulación de Datos (DML).md",
|
"Programación/JavaScript/LDM-JavaScript.md",
|
||||||
|
"Programación/HTML y CSS/CSS/LDM - CSS.md",
|
||||||
|
"Programación/HTML y CSS/HTML/LDM - HTML.md",
|
||||||
|
"Programación/PHP/M9-PHP.md",
|
||||||
|
"Documentación personal/Mecanica de Unix/1. Bash Scripting Avanzado/Expansión de parámetros.md",
|
||||||
|
"Programación/Python/Python.md",
|
||||||
|
"Servidores/M5/M5 - ASIX.md",
|
||||||
"Documentación personal/Seguridad-Informatica/Vista General 1.canvas",
|
"Documentación personal/Seguridad-Informatica/Vista General 1.canvas",
|
||||||
"Documentación personal/Seguridad-Informatica/1_Imagenes/tools/software/specops.svg",
|
"Documentación personal/Seguridad-Informatica/1_Imagenes/tools/software/specops.svg",
|
||||||
"Documentación personal/Seguridad-Informatica/1_Imagenes/tools/software/satan.png",
|
"Documentación personal/Seguridad-Informatica/1_Imagenes/tools/software/satan.png",
|
||||||
@@ -282,7 +270,6 @@
|
|||||||
"Documentación personal/Seguridad-Informatica/1_Imagenes/tools/hardware/usbkiller.jpg",
|
"Documentación personal/Seguridad-Informatica/1_Imagenes/tools/hardware/usbkiller.jpg",
|
||||||
"Documentación personal/Seguridad-Informatica/1_Imagenes/tools/hardware/rubberducky.png",
|
"Documentación personal/Seguridad-Informatica/1_Imagenes/tools/hardware/rubberducky.png",
|
||||||
"Documentación personal/Seguridad-Informatica/1_Imagenes/tools/hardware/pico_tpm_sniffer.webp",
|
"Documentación personal/Seguridad-Informatica/1_Imagenes/tools/hardware/pico_tpm_sniffer.webp",
|
||||||
"Documentación personal/Seguridad-Informatica/1_Imagenes/tools/hardware/omgcable.webp",
|
"Documentación personal/Seguridad-Informatica/1_Imagenes/tools/hardware/omgcable.webp"
|
||||||
"Documentación personal/Seguridad-Informatica/1_Imagenes/tools/hardware/Flipper Zero.jpg"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
595
BDD/SQL/Apuntes generales de SQL.md
Normal file
595
BDD/SQL/Apuntes generales de SQL.md
Normal file
@@ -0,0 +1,595 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
---
|
||||||
|
#SQL-ASIX - Structured Query Language
|
||||||
|
Proveniente de [[SQL]]
|
||||||
|
- Autor: [Lil_Carpi](https://github.com/Lil-Carpi)
|
||||||
|
- Fecha de creación: 13-14/12/2025
|
||||||
|
---
|
||||||
|
```table-of-contents
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
#### Video de referencia:
|
||||||
|

|
||||||
|
[Aprende SQL](https://youtu.be/uUdKAYl-F7g)
|
||||||
|
|
||||||
|
---
|
||||||
|
## Notas a tener en cuenta
|
||||||
|
- TODOS los comandos terminan en `;`.
|
||||||
|
- Para hacer un UPDATE y DELETE, se recomienda usar la PK(`id`) para evitar errores, pero no es obligatorio.
|
||||||
|
- Todo lo que sale aquí va orientado para MariaDB por terminal, aunque sirve igual para MySQL Workbench, ya que los comandos son los mismos.
|
||||||
|
- Los ejemplos de este documento son simples, por lo que se usan VARCHAR y INT. Por favor, usad datos correspondientes indicados en [[Tipos de datos]].
|
||||||
|
- `user` Es una palabra reservada. NO LA USÉIS NUNCA POR USAR. En este caso, están porque facilita el entendimiento y la simplificación. En caso de tener que crear una tabla de usuarios, usad algo como `allusers` o similar, pero NUNCA `user`.
|
||||||
|
- La sensibilidad a las mayúsculas y minúsculas en MariaDB depende del `collation`. Normalmente, es **case-insensitive**, PERO NO SIEMPRE.
|
||||||
|
- En producción, el `SELECT *` se ha de listar columnas especificas para evitar problemas de rendimientro y cambios de esquema.
|
||||||
|
### Tipos de datos
|
||||||
|
- **INT (INTEGER)**: Números enteros.
|
||||||
|
- **Float**: Decimales. Cuidado con los errores de precisión.
|
||||||
|
- **Varchar**: Strings o letras.
|
||||||
|
- Es recomendable usar mas tipos de datos.
|
||||||
|
Más información en [[Tipos de datos]]
|
||||||
|
|
||||||
|
![[Tipos de datos]]
|
||||||
|
|
||||||
|
---
|
||||||
|
# Bases de datos
|
||||||
|
## Creación de base de datos:
|
||||||
|
|
||||||
|
```SQL
|
||||||
|
CREATE DATABASE nombre;
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
Ver bases de datos
|
||||||
|
|
||||||
|
```SQL
|
||||||
|
SHOW DATABASES;
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
### Seleccionar base de datos
|
||||||
|
```SQL
|
||||||
|
USE basededatos;
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
### Comentarios
|
||||||
|
```SQL
|
||||||
|
-- Cualquier cosa que sea escrita despues de "--" será ignorado.
|
||||||
|
```
|
||||||
|
---
|
||||||
|
### Crear tablas:
|
||||||
|
```SQL
|
||||||
|
CREATE TABLE animales (
|
||||||
|
id INT NOT NULL AUTO_INCREMENT,
|
||||||
|
tipo VARCHAR(255) DEFAULT NULL,
|
||||||
|
estado VARCHAR(255) DEFAULT NULL,
|
||||||
|
PRIMARY KEY (id)
|
||||||
|
);
|
||||||
|
```
|
||||||
|
> Entre paréntesis se colocan los datos que se van a almacenar en la tabla.
|
||||||
|
> Es recomendable separarlos entre espacios y seleccionar el tipo de dato que se va a usar con esa sección. También, se ha de seleccionar la clave primaria e indicarla entre paréntesis.
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
### Insertar datos en tablas:
|
||||||
|
```SQL
|
||||||
|
INSERT INTO animales (tipo, estado) VALUES ('Chanchito', 'Feliz');
|
||||||
|
```
|
||||||
|
> De la tabla `animales`, se le insertan a las columnas `tipo` y `estado` los valores `'Chanchito'` y `'Feliz'`, en ese orden.
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
### Modificación de tablas:
|
||||||
|
```SQL
|
||||||
|
ALTER TABLE animales MODIFY COLUMN id INT NOT NULL AUTO_INCREMENT;
|
||||||
|
```
|
||||||
|
> Caso hipotético en el cual la tabla que hemos creado antes no ha tenido la variable `AUTO_INCREMENT` desde un inicio.
|
||||||
|
> Nota: Se ha de indicar de nuevo el tipo de valor que se le da a la columna `id`, en este caso, `INT`.
|
||||||
|
|
||||||
|
---
|
||||||
|
#### Renombrar tablas
|
||||||
|
```SQL
|
||||||
|
RENAME TABLE user TO users;
|
||||||
|
```
|
||||||
|
>Renombra la tabla user a users
|
||||||
|
|
||||||
|
---
|
||||||
|
### Listar elementos de una tabla
|
||||||
|
```SQL
|
||||||
|
SELECT * FROM animales;
|
||||||
|
```
|
||||||
|
> Lista TODAS las columnas de la tabla animales
|
||||||
|
|
||||||
|
```SQL
|
||||||
|
SELECT * FROM ANIMALES WHERE ID = 1;
|
||||||
|
```
|
||||||
|
> Lista todas las columnas de la tabla animales donde el ID sea 1
|
||||||
|
|
||||||
|
```SQL
|
||||||
|
SELECT * FROM animales WHERE estado = 'Feliz';
|
||||||
|
```
|
||||||
|
> Lista todas las columnas de la tabla animales donde el estado sea 'Feliz'
|
||||||
|
> Nota: Los strings se pasan entre comillas simples (`''`).
|
||||||
|
|
||||||
|
```SQL
|
||||||
|
SELECT * FROM animales WHERE estado = 'Feliz' AND tipo = 'Chanchito';
|
||||||
|
```
|
||||||
|
>Lista todas las columnas de la tabla animales donde el estado sea 'Feliz' Y tipo sea 'Chanchito'.
|
||||||
|
> Nota: También se puede usar la variable `OR`.
|
||||||
|
|
||||||
|
También podemos hacer selecciones con condiciones más, menos, igual, etc:
|
||||||
|
```SQL
|
||||||
|
SELECT * FROM users WHERE edad > 20;
|
||||||
|
```
|
||||||
|
> Se puede cambiar el `>` por `<`, `>=`, `<=` y `!=`.
|
||||||
|
|
||||||
|
Se pueden filtrar también por strings de datos:
|
||||||
|
```SQL
|
||||||
|
SELECT * FROM users WHERE email = 'Antonio@fulano.com';
|
||||||
|
```
|
||||||
|
> Lista todas las columnas de la tabla users donde el email sea ' Antonio@fulano.com'
|
||||||
|
#### `BETWEEN`
|
||||||
|
También se le pueden buscar ENTRE dos valores:
|
||||||
|
```SQL
|
||||||
|
SELECT * FROM users WHERE edad BETWEEN 15 and 30;
|
||||||
|
```
|
||||||
|
>Lista todas las columnas de la tabla users donde la edad se encuentre entre 15 y 30.
|
||||||
|
#### `LIKE`
|
||||||
|
Podemos buscar por valores que "se parece a", con los `%%`:
|
||||||
|
```SQL
|
||||||
|
SELECT * FROM users WHERE email LIKE '%gmail%';
|
||||||
|
```
|
||||||
|
> Lista todas las columnas de la tabla users donde el email se parezca a ' `%gmail%`'.
|
||||||
|
> Nota: En este caso, lo único que busca va a ser el valor '`gmail`'. Todo lo que se encuentre alrededor de ese valor será ignorado. También podemos hacer búsquedas como '`fulano%`', que sirve cuando sabemos el nombre del usuario, pero no sabemos que apellido tiene.
|
||||||
|
> Las búsquedas con `%` al inicio, no usan índices.
|
||||||
|
|
||||||
|
#### `ORDER BY`
|
||||||
|
Se pueden ordenar las consultas por orden ASCENDENTE (`ASC`) y DESCENDENTE (`DESC`):
|
||||||
|
```SQL
|
||||||
|
SELECT * FROM users ORDER BY edad ASC;
|
||||||
|
-- TAMBIEN
|
||||||
|
SELECT * FROM users ORDER BY edad DESC;
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
#### `max()` y `min()`
|
||||||
|
Las funciones `max()` y `min()` nos permiten filtrar por la cantidad máxima y mínima entre valores de INT:
|
||||||
|
```SQL
|
||||||
|
SELECT max(edad) AS mayor FROM users;
|
||||||
|
-- Tambien
|
||||||
|
SELECT min(edad) AS menor FROM users;
|
||||||
|
```
|
||||||
|
>
|
||||||
|
> Nota: `AS` Se utiliza para dar nombre a la consulta que estamos dando.
|
||||||
|
|
||||||
|
|
||||||
|
#### Listar columnas específicas
|
||||||
|
Podemos filtrar directamente por columnas que nos interesen ver:
|
||||||
|
```SQL
|
||||||
|
SELECT id, name FROM users;
|
||||||
|
```
|
||||||
|
> Lista la columna id y name de la tabla users.
|
||||||
|
|
||||||
|
|
||||||
|
#### Listar con aliases (`AS`):
|
||||||
|
En caso de que tengamos un nombre de una columna que queramos ver con otro nombre sin modificarlo, podemos usar `AS`:
|
||||||
|
```SQL
|
||||||
|
SELECT id, name AS nombre FROM users;
|
||||||
|
```
|
||||||
|
> Lista la columna id y name como nombre de la tabla users.
|
||||||
|
> Nota: Las PRIMARY KEYS son inmutables ante esta condición.
|
||||||
|
|
||||||
|
---
|
||||||
|
### Update de registros
|
||||||
|
|
||||||
|
```SQL
|
||||||
|
UPDATE animales SET estado = 'Feliz' WHERE id = 3;
|
||||||
|
```
|
||||||
|
> Actualiza la tabla animales y pon el estado `'Feliz'` al registro que tenga un `id` de 3.
|
||||||
|
> Nota: Para hacer un UPDATE y DELETE, se ha de indicar el `id` de lo que se va a borrar o actualizar, aunque no es obligatorio. Se recomienda usar condiciones especificas (normalmente la PK) para evitar modificar/borrar múltiples filas por error.
|
||||||
|
|
||||||
|
---
|
||||||
|
### Borrar registros
|
||||||
|
|
||||||
|
```SQL
|
||||||
|
DELETE FROM animales WHERE id = 3;
|
||||||
|
```
|
||||||
|
> Borra el registro de la tabla animales en donde el `id` sea 3.
|
||||||
|
> Nota: Para hacer un UPDATE y DELETE, se ha de indicar el `id` de lo que se va a borrar o actualizar, aunque no es obligatorio.Se recomienda usar condiciones especificas (normalmente la PK) para evitar modificar/borrar múltiples filas por error.
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
### `LIMIT`
|
||||||
|
```SQL
|
||||||
|
SELECT * FROM users LIMIT 2;
|
||||||
|
```
|
||||||
|
> Lista todas las columnas de la tabla users y devuelve las primeras 2 líneas que encuentres.
|
||||||
|
> Nota: Se pueden cambiar por la cantidad de líneas que queramos ver.
|
||||||
|
|
||||||
|
---
|
||||||
|
## Joins (Relacionar tablas, conocido como Llaves Foraneas)
|
||||||
|
|
||||||
|
Tengo una tabla, la cual es:
|
||||||
|
```SQL
|
||||||
|
MariaDB [empresa]> SELECT * FROM users;
|
||||||
|
+----+---------+------+------------------+
|
||||||
|
| id | name | edad | email |
|
||||||
|
+----+---------+------+------------------+
|
||||||
|
| 1 | Juan | 25 | juan@juan.com |
|
||||||
|
| 2 | Alberto | 19 | alberto@juan.com |
|
||||||
|
| 3 | Leyre | 22 | Leyre@juan.com |
|
||||||
|
| 4 | Antonio | 52 | Antonio@juan.com |
|
||||||
|
| 5 | Ariel | 31 | Ariel@juan.com |
|
||||||
|
+----+---------+------+------------------+
|
||||||
|
```
|
||||||
|
|
||||||
|
Y quiero hacer un join de una tabla, la cual relacione él id de cada usuario con la creación de un producto en otra tabla llamada `products`. Se ha de hacer:
|
||||||
|
```SQL
|
||||||
|
CREATE TABLE products(
|
||||||
|
id INT NOT NULL AUTO_INCREMENT,
|
||||||
|
name VARCHAR(50) NOT NULL,
|
||||||
|
created_by INT NOT NULL,
|
||||||
|
marca VARCHAR(50) NOT NULL,
|
||||||
|
PRIMARY KEY(id),
|
||||||
|
FOREIGN KEY(created_by) REFERENCES `users`(id)
|
||||||
|
) ENGINE=InnoDB;
|
||||||
|
```
|
||||||
|
> En la parte de la llave foranea, describimos:
|
||||||
|
> La llave foranea será la columna `created_by` y su referencia se encuentra en la tabla `users` y la columna es `id`.
|
||||||
|
> Nota: Hay que usar BACKTICKS para seleccionar la tabla con nombres especiales, en este caso, `user` es un nombre especial en MariaDB. En una situación real, NO UTILICEIS `user` COMO NOMBRE DE TABLA. Tambien, el `ENGINE` es IMPORTANTE ponerlo. Sin `ENGINE`, no hay FK.
|
||||||
|
|
||||||
|
---
|
||||||
|
#### Insercion de multiples datos con un solo `INSERT`
|
||||||
|
Ahora, podemos añadir productos en la tabla products creadas por los usuarios de la tabla users:
|
||||||
|
```SQL
|
||||||
|
INSERT INTO products (name, created_by, marca)
|
||||||
|
VALUES
|
||||||
|
('ipad', 1, 'apple'),
|
||||||
|
('iphone', 1, 'apple'),
|
||||||
|
('watch', 2, 'apple'),
|
||||||
|
('macbook', 1, 'apple'),
|
||||||
|
('imac', 3, 'apple'),
|
||||||
|
('ipad mini', 2, 'apple');
|
||||||
|
```
|
||||||
|
> Inserta a la tabla productos dentro de las columnas name, created_by y marca...
|
||||||
|
|
||||||
|
Resultado:
|
||||||
|
```SQL
|
||||||
|
MariaDB [empresa]> SELECT * FROM products;
|
||||||
|
+----+-----------+------------+-------+
|
||||||
|
| id | name | created_by | marca |
|
||||||
|
+----+-----------+------------+-------+
|
||||||
|
| 1 | ipad | 1 | apple |
|
||||||
|
| 2 | iphone | 1 | apple |
|
||||||
|
| 3 | watch | 2 | apple |
|
||||||
|
| 4 | macbook | 1 | apple |
|
||||||
|
| 5 | imac | 3 | apple |
|
||||||
|
| 6 | ipad mini | 2 | apple |
|
||||||
|
+----+-----------+------------+-------+
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
## LEFT JOIN
|
||||||
|
Trae todos los registros dentro de la tabla de usuarios. En el caso de que se encuentren registros que se encuentren dentro de la tabla de productos que hayan sido creados por los usuarios que se encuentren en la tabla usuarios, aparecerán dentro de la consulta. En caso de que salgan usuarios que no hayan creado productos en la tabla de productos, simplemente márcamelos como `null`.
|
||||||
|
|
||||||
|
|
||||||
|
```SQL
|
||||||
|
SELECT u.id, u.email, p.name FROM users u LEFT JOIN products p ON u.id = p.created_by;
|
||||||
|
```
|
||||||
|
> Selecciona de la tabla de usuario, reconócelo con el alias `u`, y tráeme las columnas de id y email. Ahora, haz un LEFT JOIN con la tabla users como principal de producto, reconócelo como `p`, y tráeme la columna name y junta las columnas id de la tabla de usuario y created_by de la tabla de productos.
|
||||||
|
|
||||||
|
Resultado:
|
||||||
|
```SQL
|
||||||
|
+----+------------------+-----------+
|
||||||
|
| id | email | name |
|
||||||
|
+----+------------------+-----------+
|
||||||
|
| 1 | juan@juan.com | ipad |
|
||||||
|
| 1 | juan@juan.com | iphone |
|
||||||
|
| 2 | alberto@juan.com | watch |
|
||||||
|
| 1 | juan@juan.com | macbook |
|
||||||
|
| 3 | Leyre@juan.com | imac |
|
||||||
|
| 2 | alberto@juan.com | ipad mini |
|
||||||
|
| 4 | Antonio@juan.com | NULL |
|
||||||
|
| 5 | Ariel@juan.com | NULL |
|
||||||
|
+----+------------------+-----------+
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
## RIGHT JOIN
|
||||||
|
Mismo que `LEFT JOIN`, pero al revés.
|
||||||
|
Nos trae el producto y en caso de que exista, nos va a traer un usuario asociado.
|
||||||
|
```SQL
|
||||||
|
SELECT u.id, u.email, p.name FROM users u RIGHT JOIN products p ON u.id = p.created_by;
|
||||||
|
```
|
||||||
|
> Selecciona de la tabla de usuario, reconócelo con el alias `u`, y tráeme las columnas de id y email. Ahora, haz un RIGHT JOIN con la tabla de producto, reconócelo como `p`, y tráeme la columna name y junta las columnas id de la tabla de usuario y created_by de la tabla de productos.
|
||||||
|
|
||||||
|
Resultado:
|
||||||
|
```SQL
|
||||||
|
+------+------------------+-----------+
|
||||||
|
| id | email | name |
|
||||||
|
+------+------------------+-----------+
|
||||||
|
| 1 | juan@juan.com | ipad |
|
||||||
|
| 1 | juan@juan.com | iphone |
|
||||||
|
| 2 | alberto@juan.com | watch |
|
||||||
|
| 1 | juan@juan.com | macbook |
|
||||||
|
| 3 | Leyre@juan.com | imac |
|
||||||
|
| 2 | alberto@juan.com | ipad mini |
|
||||||
|
+------+------------------+-----------+
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
## INNER JOIN
|
||||||
|
Nos trae tanto usuarios como productos, pero siempre y cuando estos dos puedan ser asociados entre sí.
|
||||||
|
```SQL
|
||||||
|
SELECT u.id, u.email, p.name FROM users u INNER JOIN products p ON u.id = p.created_by;
|
||||||
|
```
|
||||||
|
> Selecciona de la tabla de usuario, reconócelo con el alias `u`, y tráeme las columnas de id y email. Ahora, haz un INNER JOIN con la tabla de producto, reconócelo como `p`, y tráeme la columna name y junta las columnas id de la tabla de usuario y created_by de la tabla de productos.
|
||||||
|
|
||||||
|
Resultado:
|
||||||
|
```SQL
|
||||||
|
+----+------------------+-----------+
|
||||||
|
| id | email | name |
|
||||||
|
+----+------------------+-----------+
|
||||||
|
| 1 | juan@juan.com | ipad |
|
||||||
|
| 1 | juan@juan.com | iphone |
|
||||||
|
| 2 | alberto@juan.com | watch |
|
||||||
|
| 1 | juan@juan.com | macbook |
|
||||||
|
| 3 | Leyre@juan.com | imac |
|
||||||
|
| 2 | alberto@juan.com | ipad mini |
|
||||||
|
+----+------------------+-----------+
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
## CROSS JOIN
|
||||||
|
Devuelve el producto cartesiano entre dos tablas.
|
||||||
|
Básicamente:
|
||||||
|
![[Mezcla-cartesiana_(CROSS_JOIN).png]]
|
||||||
|
|
||||||
|
```SQL
|
||||||
|
SELECT u.id, u.name, p.id, p.name FROM users u CROSS JOIN products p;
|
||||||
|
```
|
||||||
|
>Nota: No es recomendado hacerlo, y si se ha de hacerlo, hay que tener cuidado por la cantidad insana de datos que nos puede escupir. Puede bloquear la BD si los datos que escupen son grandes, así que, repito, MUCHO CUIDADO.
|
||||||
|
|
||||||
|
Resultado:
|
||||||
|
```SQL
|
||||||
|
+----+---------+----+-----------+
|
||||||
|
| id | name | id | name |
|
||||||
|
+----+---------+----+-----------+
|
||||||
|
| 1 | Juan | 1 | ipad |
|
||||||
|
| 2 | Alberto | 1 | ipad |
|
||||||
|
| 3 | Leyre | 1 | ipad |
|
||||||
|
| 4 | Antonio | 1 | ipad |
|
||||||
|
| 5 | Ariel | 1 | ipad |
|
||||||
|
| 1 | Juan | 2 | iphone |
|
||||||
|
| 2 | Alberto | 2 | iphone |
|
||||||
|
| 3 | Leyre | 2 | iphone |
|
||||||
|
| 4 | Antonio | 2 | iphone |
|
||||||
|
| 5 | Ariel | 2 | iphone |
|
||||||
|
| 1 | Juan | 3 | watch |
|
||||||
|
| 2 | Alberto | 3 | watch |
|
||||||
|
| 3 | Leyre | 3 | watch |
|
||||||
|
| 4 | Antonio | 3 | watch |
|
||||||
|
| 5 | Ariel | 3 | watch |
|
||||||
|
| 1 | Juan | 4 | macbook |
|
||||||
|
| 2 | Alberto | 4 | macbook |
|
||||||
|
| 3 | Leyre | 4 | macbook |
|
||||||
|
| 4 | Antonio | 4 | macbook |
|
||||||
|
| 5 | Ariel | 4 | macbook |
|
||||||
|
| 1 | Juan | 5 | imac |
|
||||||
|
| 2 | Alberto | 5 | imac |
|
||||||
|
| 3 | Leyre | 5 | imac |
|
||||||
|
| 4 | Antonio | 5 | imac |
|
||||||
|
| 5 | Ariel | 5 | imac |
|
||||||
|
| 1 | Juan | 6 | ipad mini |
|
||||||
|
| 2 | Alberto | 6 | ipad mini |
|
||||||
|
| 3 | Leyre | 6 | ipad mini |
|
||||||
|
| 4 | Antonio | 6 | ipad mini |
|
||||||
|
| 5 | Ariel | 6 | ipad mini |
|
||||||
|
+----+---------+----+-----------+
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
### Esquema de todos los JOIN:
|
||||||
|
- **LEFT**: Usuarios aunque no tengan producto.
|
||||||
|
- **INNER**: Solo relaciones validas.
|
||||||
|
- **RIGHT**: Casi nunca se usa en práctica.
|
||||||
|
|
||||||
|
---
|
||||||
|
## GROUP BY
|
||||||
|
Se utilizan con instrucciones que, por lo general, tienden a agrupar elementos.
|
||||||
|
|
||||||
|
```SQL
|
||||||
|
SELECT count(id), marca FROM products GROUP BY marca;
|
||||||
|
```
|
||||||
|
> Lista de la tabla products la cantidad de productos de las marcas que existan
|
||||||
|
|
||||||
|
Resultado:
|
||||||
|
```SQL
|
||||||
|
+-----------+-------+
|
||||||
|
| count(id) | marca |
|
||||||
|
+-----------+-------+
|
||||||
|
| 6 | apple |
|
||||||
|
+-----------+-------+
|
||||||
|
```
|
||||||
|
|
||||||
|
También podemos hacer lo mismo mezclándolo con un LEFT JOIN con la tabla de usuarios, donde la tabla primaria será la tabla de products:
|
||||||
|
```SQL
|
||||||
|
SELECT count(p.id), u.name FROM products p LEFT JOIN users u on u.id = p.created_by GROUP BY p.created_by;
|
||||||
|
```
|
||||||
|
|
||||||
|
Resultado:
|
||||||
|
```SQL
|
||||||
|
+-------------+---------+
|
||||||
|
| count(p.id) | name |
|
||||||
|
+-------------+---------+
|
||||||
|
| 3 | Juan |
|
||||||
|
| 2 | Alberto |
|
||||||
|
| 1 | Leyre |
|
||||||
|
+-------------+---------+
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### `HAVING`
|
||||||
|
Podemos añadir condiciones. Por ejemplo, que el conteo sea mayor a 2:
|
||||||
|
```SQL
|
||||||
|
SELECT count(p.id), u.name FROM products p LEFT JOIN users u on u.id = p.created_by GROUP BY p.created_by HAVING count(p.id) >= 2;
|
||||||
|
```
|
||||||
|
|
||||||
|
Resultado:
|
||||||
|
```SQL
|
||||||
|
+-------------+---------+
|
||||||
|
| count(p.id) | name |
|
||||||
|
+-------------+---------+
|
||||||
|
| 3 | Juan |
|
||||||
|
| 2 | Alberto |
|
||||||
|
+-------------+---------+
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
## `DROP`
|
||||||
|
Sirve para eliminar tablas enteras.
|
||||||
|
```SQL
|
||||||
|
DROP TABLE products;
|
||||||
|
```
|
||||||
|
> Elimina la tabla de products.
|
||||||
|
> Nota: ¡CUIDADO CON ESTO! ¡LOS CAMBIOS SON IRREVERSIBLES!
|
||||||
|
|
||||||
|
---
|
||||||
|
## `ON DELETE` / `ON UPDATE`
|
||||||
|
Se utilizan en **llaves foráneas** para definir que ocurre cuando el registro referenciado cambia o se elimina.
|
||||||
|
```SQL
|
||||||
|
FOREIGN KEY (created_by) REFERENCES users(id)
|
||||||
|
ON DELETE <acción>
|
||||||
|
ON UPDATE <acción>
|
||||||
|
```
|
||||||
|
> Nota: Si NO se especifica nada, el comportamiento por defecto suele ser `RESTRICT`.
|
||||||
|
|
||||||
|
---
|
||||||
|
### `ON DELETE`
|
||||||
|
Define qué pasa cuando se elimina un registro de la tabla padre.
|
||||||
|
```SQL
|
||||||
|
ON DELETE RESTRICT --Restrict por defecto.
|
||||||
|
```
|
||||||
|
> No permite borrar el registro padre si hay hijos asociados. Es la opción más segura.
|
||||||
|
|
||||||
|
Ejemplo:
|
||||||
|
- No se puede borrar un usuario si tiene productos creados.
|
||||||
|
Uso recomendado:
|
||||||
|
- Datos críticos.
|
||||||
|
- Integridad estricta.
|
||||||
|
- Producción.
|
||||||
|
|
||||||
|
---
|
||||||
|
### `CASCADE`
|
||||||
|
Al borrar el padre, se borran automáticamente los hijos. Es peligroso si no sabes lo que estás haciendo. CUIDADO CON ESTO.
|
||||||
|
```SQL
|
||||||
|
ON DELETE CASCADE
|
||||||
|
```
|
||||||
|
|
||||||
|
Ejemplo:
|
||||||
|
- Borras un usuario -> Se borran todos sus productos.
|
||||||
|
Usos:
|
||||||
|
- Datos temporales
|
||||||
|
- Relaciones dependientes al 100%
|
||||||
|
|
||||||
|
>[!Warning]
|
||||||
|
>Un `DELETE` mal hecho PUEDE BORRAR MEDIA BASE DE DATOS.
|
||||||
|
|
||||||
|
---
|
||||||
|
### `SET NULL`
|
||||||
|
Al borrar el padre, la FK del hijo pasa a `null`. La columna **DEBE PERMITIR `NULL`**.
|
||||||
|
```SQL
|
||||||
|
ON DELETE SET NULL
|
||||||
|
```
|
||||||
|
|
||||||
|
Ejemplo:
|
||||||
|
- El producto sigue existiendo, pero ya no tiene creador.
|
||||||
|
Usos:
|
||||||
|
- Históricos
|
||||||
|
- Logs
|
||||||
|
- Datos que deben conservarse.
|
||||||
|
|
||||||
|
---
|
||||||
|
### `NO ACTION`
|
||||||
|
En MariaDB/MySQL se comporta igual que `RESTRICT` (aunque internamente SQL define `NO ACTION`). Existe por la compatibilidad con SQL.
|
||||||
|
```SQL
|
||||||
|
ON DELETE NO ACTION
|
||||||
|
```
|
||||||
|
|
||||||
|
Usos:
|
||||||
|
- En MariaDB, ninguno xd.
|
||||||
|
|
||||||
|
---
|
||||||
|
## `ON UPDATE`
|
||||||
|
Define qué pasa si cambia el valor de la **clave primaria referenciada**. Cambiar un PK en producción **NO es buena practica**, aunque exista el `ON UPDATE CASCADE`.
|
||||||
|
|
||||||
|
### `CASCADE`
|
||||||
|
Si cambia el `id` del padre, se actualiza el de los hijos. Es poco común, pero es correcto.
|
||||||
|
```SQL
|
||||||
|
ON UPDATE CASCADE
|
||||||
|
```
|
||||||
|
|
||||||
|
Ejemplo:
|
||||||
|
- Cambia el id de un usuario -> se actualiza en la tabla products.
|
||||||
|
|
||||||
|
---
|
||||||
|
### `RESTRICT`/`NO ACTION`
|
||||||
|
Impide cambiar la PK si hay relaciones.
|
||||||
|
```SQL
|
||||||
|
ON UPDATE RESTRICT
|
||||||
|
```
|
||||||
|
|
||||||
|
Uso:
|
||||||
|
- Lo normal en producción.
|
||||||
|
|
||||||
|
---
|
||||||
|
### `SET NULL`
|
||||||
|
Si cambia la PK, la FK pasa a NULL. Esto es muy raro de ver en la práctica.
|
||||||
|
```SQL
|
||||||
|
ON UPDATE SET NULL
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
## Ejemplo realista
|
||||||
|
```SQL
|
||||||
|
CREATE TABLE products (
|
||||||
|
id INT NOT NULL AUTO_INCREMENT,
|
||||||
|
name VARCHAR(50) NOT NULL,
|
||||||
|
created_by INT NULL,
|
||||||
|
marca VARCHAR(50) NOT NULL,
|
||||||
|
PRIMARY KEY(id),
|
||||||
|
FOREIGN KEY (created_by) REFERENCES users(id)
|
||||||
|
ON DELETE SET NULL
|
||||||
|
ON UPDATE CASCADE
|
||||||
|
) ENGINE=InnoDB;
|
||||||
|
```
|
||||||
|
|
||||||
|
Explicación:
|
||||||
|
- Si se borra el usuario -> el producto se conserva
|
||||||
|
- Si cambia el id -> se actualiza automáticamente.
|
||||||
|
|
||||||
|
---
|
||||||
|
### Ejemplo ESTRICTO
|
||||||
|
```SQL
|
||||||
|
FOREIGN KEY (created_by) REFERENCES users(id)
|
||||||
|
ON DELETE RESTRICT
|
||||||
|
ON UPDATE RESTRICT
|
||||||
|
```
|
||||||
|
|
||||||
|
Explicación:
|
||||||
|
- En este caso, no se borra ni se cambia nada sin limpiar antes dependencias.
|
||||||
|
- Es lo ideal para los sistemas serios, como en producción.
|
||||||
|
|
||||||
|
---
|
||||||
|
## Resumen rápido
|
||||||
|
- `RESTRICT`: Seguridad
|
||||||
|
- `CASCADE`: Automatismo (peligroso)
|
||||||
|
- `SET NULL`: Conservar datos
|
||||||
|
- `NO ACTION`: Igual que `RESTRICT` en MariaDB
|
||||||
|
|
||||||
|
>[!note]
|
||||||
|
>Si no sabes qué usar, `RESTRICT`.
|
||||||
|
>Si usas `CASCADE`, es porque sabes lo que haces y lo has pensado dos veces.
|
||||||
|
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
#SQL-ASIX - Structure Query Language
|
||||||
|
Proveniente de [[SQL]]
|
||||||
|
|
||||||
---
|
---
|
||||||
# Cosas explicadas:
|
# Cosas explicadas:
|
||||||
@@ -19,7 +21,10 @@ ON DELETE RESTRICT;
|
|||||||
- `CASCADE`:
|
- `CASCADE`:
|
||||||
```SQL
|
```SQL
|
||||||
ALTER TABLE Pedidos
|
ALTER TABLE Pedidos
|
||||||
ADD CONSTRAINT fk_pedido_cliente
|
ADD CONSTRAINT fk_pedido_cliente Programación PHP
|
||||||
|
Documento Padre
|
||||||
|
|
||||||
|
---
|
||||||
FOREIGN KEY (id_cliente) REFERENCES Clientes(id)
|
FOREIGN KEY (id_cliente) REFERENCES Clientes(id)
|
||||||
ON DELETE CASCADE;
|
ON DELETE CASCADE;
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
En SQL, el Lenguaje de Manipulación de Datos (DML)
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
En SQL, los Procedimientos almacenados
|
|
||||||
@@ -1,3 +1,8 @@
|
|||||||
|
#SQL-ASIX - Structure Query Language
|
||||||
|
Documento padre.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
SQL (Structured Query Language) es un lenguaje de programación estandar que se utilia para gestionar y manipular bases de datos relacionales. Permite realizar operaciones como consulta, insercion, actualizacion y eliminacion de datos almacenados en tablas. Es un lenguaje fundamental del desarrollo web y analisis de datos, y existen varios modelos de lectores de SQL, como MySQL, MariaDB, MongoDB, etc.
|
SQL (Structured Query Language) es un lenguaje de programación estandar que se utilia para gestionar y manipular bases de datos relacionales. Permite realizar operaciones como consulta, insercion, actualizacion y eliminacion de datos almacenados en tablas. Es un lenguaje fundamental del desarrollo web y analisis de datos, y existen varios modelos de lectores de SQL, como MySQL, MariaDB, MongoDB, etc.
|
||||||
|
|
||||||
Todo lo que se incluye en SQL son:
|
Todo lo que se incluye en SQL son:
|
||||||
|
|||||||
86
BDD/SQL/Tecnicismos/Disparadores.md
Normal file
86
BDD/SQL/Tecnicismos/Disparadores.md
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
#SQL-ASIX - Structure Query Language
|
||||||
|
Proveniente de [[SQL]]
|
||||||
|
|
||||||
|
---
|
||||||
|
Un **trigger** o **disparador** es un objeto que se asocia con tablas y se almacenan en la base de datos. Su nombre se deriva por el comportamiento que presentan en su funcionamiento, ya que se ejecutan cuando sucede algún evento sobre las tablas a las que se encuentra asociado. Los eventos que hacen que se ejecute un trigger son las operaciones de inserción (`INSERT`), borrado (`DELETE`), o actualización (`UPDATE`), ya que modifican los datos de una tabla.
|
||||||
|
|
||||||
|
La utilidad principal de un trigger es mejorar la gestión de la base de datos, ya que no requieren que un usuario los ejecute. Por lo tanto, son empleados para implementar las [[Reglas de negocio|reglas de negocio]] (tipo especial de integridad) de una base de datos. Una regla de negocio es cualquier restricción, requerimiento, necesidad o actividad especial que debe ser verificada al momento de intentar agregar, borrar o actualizar la información de una base de datos. Los triggers pueden prevenir errores en los datos, modificar valores de una lista, sincronizar tablas, entre otros.
|
||||||
|
|
||||||
|
---
|
||||||
|
## Combinaciones
|
||||||
|
La acción del trigger, siempre que no se viole la restricción del trigger se ejecuta dependiendo de la combinación de tipos de trigger:
|
||||||
|
|
||||||
|
- **Before statement**: Antes de ejecutar el disparo.
|
||||||
|
- **Before row**: Antes de modificar cada fila afectada por la sentencia de disparo y antes de chequear las restricciones de integridad apropiadas.
|
||||||
|
- **After statement**: Después de ejecutar la sentencia del disparo y después de chequear las restricciones de integridad apropiadas.
|
||||||
|
- **After row**: Después de modificar cada fila afectada por la sentencia del disparo y posiblemente aplicando las restricciones de integridad apropiadas.
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
## Componentes principales
|
||||||
|
Estructura básica de un "trigger":
|
||||||
|
- **Llamada de activación**: Es la sentencia que permite "disparar" el código a ejecutar.
|
||||||
|
- **Restricción**: Es la condición necesaria para realizar el código. Esta restricción puede ser de tipo condicional o de tipo nulidad.
|
||||||
|
- **Accón a ejecutar**: Es la secuencia de instrucciones a ejecutar una vez que se han cumplido las condiciones iniciales.
|
||||||
|
|
||||||
|
---
|
||||||
|
## Tipos
|
||||||
|
|
||||||
|
Existen dos tipos de disparadores que se clasifican según la cantidad de ejecuciones a realizar:
|
||||||
|
- ***Row Triggers*** (o Disparadores de fila): Son aquellas que se ejecutaran cada vez que se llama al disparador desde la tabla asociada al trigger.
|
||||||
|
- ***Statement Triggers*** (o Disparadores de secuencia): Son aquellos que, sin importar la cantidad de veces que se cumpla con la condición, su ejecución es única.
|
||||||
|
Pueden ser de sesión y almacenados; pero no son recomendables.
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
## Efectos y características
|
||||||
|
- No aceptan parámetros o argumentos (pero podrían almacenar los datos afectados en tablas temporales).
|
||||||
|
- No pueden ejecutar las operaciones ***COMMIT*** o ***ROLLBACK*** porque estas son parte de la sentencia SQL del disparador (únicamente a través de transacciones autónomas).
|
||||||
|
- Pueden causar errores de mutaciones en las tablas, si se han escrito de manera deficiente.
|
||||||
|
|
||||||
|
---
|
||||||
|
## Ejemplos
|
||||||
|
Ejemplo sencillo para SQL Server sería crear un ***Trigger*** para insertar un pedido de algún producto cuando la cantidad de este, en nuestro almacén, sea inferior a un valor dado.
|
||||||
|
```SQL
|
||||||
|
CREATE TRIGGER TR_ARTICULO
|
||||||
|
ON ARTICULOS
|
||||||
|
AFTER UPDATE
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
INSERT INTO HCO_ARTICULO
|
||||||
|
(IDARTICULO, STOCK, FECHA)
|
||||||
|
SELECT ID_ARTICULO, STOCK, GETDATE()
|
||||||
|
FROM INSERTED
|
||||||
|
END
|
||||||
|
INSERT INTO ARTICULOS VALUES (1, 'MEMORIA', 12, '12/03/2015')
|
||||||
|
|
||||||
|
SELECT * FROM ARTICULOS
|
||||||
|
|
||||||
|
UPDATE ARTICULOS
|
||||||
|
SET STOCK = STOCK -20
|
||||||
|
WHERE ID_ARTICULO = 1
|
||||||
|
|
||||||
|
SELECT * FROM HCO_ARTICULO
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
## Disparadores en MySQL
|
||||||
|
Los disparadores son soportados en MySQL a partir de la versión 5.0.2. Algunos de los soportes existentes son los disparadores para las sentencias *INSERT, UPDATE y DELETE*.
|
||||||
|
|
||||||
|
El estándar SQL:2003 requiere que los disparadores den a los programadores acceso a las variables de un registro utilizando una sintaxis como *REFERENCING NEW AS n*. Por ejemplo, si un disparador está monitoreando los cambios en la columna *salario*, podría escribirse un disparador como:
|
||||||
|
```SQL
|
||||||
|
CREATE TRIGGER ver_salario
|
||||||
|
BEFORE UPDATE ON empleados
|
||||||
|
REFERENCING NEW ROW AS n, OLD ROW AS o
|
||||||
|
FOR EACH ROW
|
||||||
|
IF n.salario <> o.salario THEN
|
||||||
|
END IF;
|
||||||
|
```
|
||||||
|
|
||||||
|
Como en MySQL las sentencies se ejecutan luego de escribir el signo punto y coma (;), cabe destacar que para crear un disparador en MySQL, antes se escribe la sentencia *DELIMITER* seguida de un carácter tal como |, la cual asigna la función del punto y coma a otro carácter permitiendo que el disparador sea escrito usando los puntos y comas sin que se ejecute mientras se escribe; después de escrito el disparador se escribe nuevamente a la sentencia ***DELIMITER;***, para asignar al punto y coma su función habitual.
|
||||||
|
|
||||||
|
---
|
||||||
|
##### Enlaces externos
|
||||||
|
|
||||||
|
- [Trigger (base de datos) - Wikipedia, la enciclopedia libre](https://es.wikipedia.org/wiki/Trigger_(base_de_datos))
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
#SQL-ASIX - Structure Query Language
|
||||||
|
Proveniente de [[SQL]]
|
||||||
|
|
||||||
|
---
|
||||||
|
En SQL, el Lenguaje de Manipulación de Datos (DML)
|
||||||
@@ -1,6 +1,9 @@
|
|||||||
---
|
---
|
||||||
|
|
||||||
---
|
---
|
||||||
|
#SQL-ASIX - Structure Query Language
|
||||||
|
Proveniente de [[SQL]]
|
||||||
|
|
||||||
---
|
---
|
||||||
El Lenguaje de definición de datos, es el que se encarga de la modificacion de la estructurea de objetos de la base de datos. Incluye ordenes para modificar, borrar o definir las tablas en las que se almacenan los datos de la base de datos.
|
El Lenguaje de definición de datos, es el que se encarga de la modificacion de la estructurea de objetos de la base de datos. Incluye ordenes para modificar, borrar o definir las tablas en las que se almacenan los datos de la base de datos.
|
||||||
Exsten cuatro operaciones basicas: CREATE, ALTER, DROP y TRUNCATE.
|
Exsten cuatro operaciones basicas: CREATE, ALTER, DROP y TRUNCATE.
|
||||||
32
BDD/SQL/Tecnicismos/Procedimientos almacenados.md
Normal file
32
BDD/SQL/Tecnicismos/Procedimientos almacenados.md
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
#SQL-ASIX - Structure Query Language
|
||||||
|
Proveniente de [[SQL]]
|
||||||
|
|
||||||
|
---
|
||||||
|
En SQL, un **procedimiento almacenado (*stored procedure*** en inglés) es un programa o procedimiento almacenado físicamente en una base de datos. Su implementación varía de un gestor de base de datos a otro. **La ventaja de un procedimiento almacenado** es que al ser ejecutado, en respuesta a una petición del usuario, es ejecutado directamente en el motor de base de datos, el cual usualmente corre en un servidor separado. Como tal, posee acceso directo a los datos que necesita manipular y solo necesita enviar grandes cantidades de datos salientes y entrantes.
|
||||||
|
|
||||||
|
Los procedimientos pueden ser ventajosos: cuando una base de datos es manipulada desde muchos programas externos. Al incluir una lógica de aplicación en la base de datos utilizando procedimientos almacenados, la necesidad de embeber la misma lógica en todos los programas que acceden a los datos es reducida. Esto puede simplificar la creación y, particularmente, el mantenimiento de los programas involucrados.
|
||||||
|
|
||||||
|
Podemos ver un claro ejemplo de estos procedimientos cuando requerimos realizar una misma operación en un servidor dentro de algunas o todas las bases de datos y a la vez dentro de todas o algunas de las tablas de las bases de datos al mismo tiempo. Para ello podemos utilizar a los procedimientos almacenados auto creables que es una forma de generar ciclos redundantes a través de los procedimientos almacenados.
|
||||||
|
|
||||||
|
## Implementación
|
||||||
|
---
|
||||||
|
Estos procedimientos se usan a menudo, pero no siempre, para realizar consultas [[SQL]] sobre los objetos de la base de datos de una manera abstracta, desde el punto de vista del cliente de la aplicación. Un **procedimiento almacenado** permite agrupar en forma exclusiva parte de algo específico que se desee realizar o, mejor dicho, el SQL apropiado para dicha acción.
|
||||||
|
|
||||||
|
## Usos
|
||||||
|
---
|
||||||
|
Los usos típicos de los **procedimientos almacenados** se aplican en la validación de datos, integrados dentro de la estructura del banco de datos. Los **procedimientos almacenados** usados con tal propósito se llaman comúnmente [[Disparadores|disparadores, o triggers]]. Otro uso común es la 'encapsulación' de una API para un proceso complejo o grande que podría requerir la 'ejecución' de varias consultas SQL, tales como la manipulación de un conjunto de datos enorme para producir un resultado resumido.
|
||||||
|
|
||||||
|
También pueden ser usados para el control de gestión de operaciones, y ejecutar procedimientos almacenados dentro de una transición, de tal manera que las transiciones sean efectivamente transparentes para ellos.
|
||||||
|
|
||||||
|
## Ventajas
|
||||||
|
---
|
||||||
|
La ventaja de un **procedimiento almacenado**, en respuesta a una petición de usuario, está directamente bajo el control del motor del gestor de bases de datos, que corre generalmente en un servidor distinto del servidor web, aumentando con ello la rapidez de procesamiento de las peticiones del usuario. El servidor de la base de datos tiene acceso directo a los datos necesarios para manipular y solo necesita enviar el resultado final al usuario. Los datos, que pueden simplificar la gestión de datos y reducir la necesidad de codificar la lógica en el resto de los programas cliente. Esto puede reducir la probabilidad de que los datos se corrompan por el uso de programas clientes defectuosos o erróneos. De este modo, el motor de base de datos puede asegurar la integridad de los datos y su consistencia con la ayuda de procedimientos almacenados. Algunos afirman que las bases de datos deben ser utilizadas para el almacenamiento de datos solamente, y que la lógica de negocio solo debería aplicarse en la capa de negocio del código, a través de aplicaciones cliente que deban acceder a los datos. Sin embargo, el uso de procedimientos almacenados no se opone a la utilización de una capa de negocio.
|
||||||
|
|
||||||
|
El siguiente es un ejemplo de procedimiento almacenado en MySQL:
|
||||||
|
```SQL
|
||||||
|
CREATE PROCEDURE nombreProcedimiento([parametro1, parametro2,...])
|
||||||
|
[Atributos]
|
||||||
|
BEGIN Instrucciones
|
||||||
|
END
|
||||||
|
```
|
||||||
|
|
||||||
@@ -1,3 +1,7 @@
|
|||||||
|
#SQL-ASIX - Structure Query Language
|
||||||
|
Proveniente de [[SQL]]
|
||||||
|
|
||||||
|
---
|
||||||
SQL es non-case sensitive, entonces no es necesario indicar las keywords en mayúscula, pero la recomendación y lo aceptado es siempre poner las keywords e instrucciones en mayúscula, por ejemplo:
|
SQL es non-case sensitive, entonces no es necesario indicar las keywords en mayúscula, pero la recomendación y lo aceptado es siempre poner las keywords e instrucciones en mayúscula, por ejemplo:
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
@@ -1,18 +1,28 @@
|
|||||||
|
#SQL-ASIX - Structured Query Language
|
||||||
|
Proveniente de [[SQL]]
|
||||||
|
|
||||||
|
---
|
||||||
SQL maneja varios tipos de datos. Estos tipos de datos se diferencian para la introduccion de datos en especifico, datos con cierta cantidad de letras o numeros, o un numero especifico de caracteres.
|
SQL maneja varios tipos de datos. Estos tipos de datos se diferencian para la introduccion de datos en especifico, datos con cierta cantidad de letras o numeros, o un numero especifico de caracteres.
|
||||||
|
|
||||||
Algunos de los tipos de datos basicos de SQL son:
|
Algunos de los tipos de datos basicos de SQL son:
|
||||||
|
|
||||||
|
---
|
||||||
## Numeros enteros:
|
## Numeros enteros:
|
||||||
- **TINYINT(Tamaño)**: -128 a 127 normal. 0 a 255 sin signo. La cantidad maxima de digitos se puede especificar entre parentesis.
|
- **TINYINT**: -128 a 127 normal. 0 a 255 sin signo.
|
||||||
- **SMALLINT(Tamaño)**: -32768 a 32767 normal. 0 a 65535 sin signo. La cantidad maxima de digitos se pueden especificar entre parentesis.
|
- **SMALLINT**: -32768 a 32767 normal. 0 a 65535 sin signo.
|
||||||
- **MEDIUMINT(Tamaño)**: -8388608 a 8388607 normal. 0 a 16777215 sin signo. La cantidad maxima de digitos se pueden especificar entre parentesis.
|
- **MEDIUMINT**: -8388608 a 8388607 normal. 0 a 16777215 sin signo.
|
||||||
- **INT(Tamaño)**: -2147483648 a 2147483647 normal. 0 a 4294967295 sin signo. La cantidad maxima de digitos se pueden especificar entre parentesis.
|
- **INT**: Da al valor el tipo INTEGER. Entero de 32 bits. Rango: -2147483648 a 2147483647 (signed)
|
||||||
- **BIGINT(Tamaño)**: -9223372036854775808 a 9223372036854775807 normal. 0 a 18446744073709551615 sin signo. La cantidad maxima de digitos se pueden especificar entre parentesis.
|
- **BIGINT**: -9223372036854775808 a 9223372036854775807 normal. 0 a 18446744073709551615 sin signo.
|
||||||
|
|
||||||
|
---
|
||||||
## Numeros en punto flotante
|
## Numeros en punto flotante
|
||||||
- **FLOAT(tamaño, d)**: Un pequeño numero con un punto decimal flotante. La cantidad maxima de digitos puede especificar en el parametro de tamaño. El numero maximo de digitos a la derecha del punto decimal se especifica en el parametro d.
|
- **FLOAT(tamaño, d)**: Un pequeño numero con un punto decimal flotante. La cantidad maxima de digitos puede especificar en el parametro de tamaño. El numero maximo de digitos a la derecha del punto decimal se especifica en el parametro d.
|
||||||
- **DECIMAL(tamaño, d)**: Un DOBLE almacenado como una cadena, lo que permite un punto decimal fijo. La cantidad maxima de digitos se puede especificar en el parametro de tamaño. El numero maximo de digitos a la derecha del punto decimal se especifica en el parametro d.
|
- **DECIMAL(tamaño, d)**: Un número exacto almacenado internamente en formato decimal fijo. La cantidad maxima de digitos se puede especificar en el parametro de tamaño. El numero maximo de digitos a la derecha del punto decimal se especifica en el parametro d.
|
||||||
|
|
||||||
|
>[!bug]
|
||||||
|
>FLOAT es un tipo aproximado y puede introducir errores de precisión.
|
||||||
|
|
||||||
|
---
|
||||||
## Fechas y tiempos
|
## Fechas y tiempos
|
||||||
- **DATE ()**: Una fecha. Formato: AAAA-MM-DD.
|
- **DATE ()**: Una fecha. Formato: AAAA-MM-DD.
|
||||||
- **DATETIME ()**: Una combinacion de fecha y hora. Formato: AAAA-MM-DD HH:MI:SS.
|
- **DATETIME ()**: Una combinacion de fecha y hora. Formato: AAAA-MM-DD HH:MI:SS.
|
||||||
@@ -27,10 +37,10 @@ Algunos de los tipos de datos basicos de SQL son:
|
|||||||
> Para TIME, el rango admitido es de '-838:59:59' a '838:59:59'
|
> Para TIME, el rango admitido es de '-838:59:59' a '838:59:59'
|
||||||
> Para YEAR, los valores permitidos van en 4 digitos: de 1901 a 2155. Valores permitidos en formato de dos digitos: 70 a 69, que representan los años de 1970 a 2069.
|
> Para YEAR, los valores permitidos van en 4 digitos: de 1901 a 2155. Valores permitidos en formato de dos digitos: 70 a 69, que representan los años de 1970 a 2069.
|
||||||
|
|
||||||
|
---
|
||||||
## Cadena de caracteres:
|
## Cadena de caracteres:
|
||||||
- **CHAR (Tamaño)**: Cadena de longitud fija (puede contener letras, numeros y caracteres especiales), El tamaño fijo se especifica entre parentesis. Puede almacenar hasta 255 caracteres.
|
- **CHAR (Tamaño)**: Cadena de longitud fija (puede contener letras, numeros y caracteres especiales), El tamaño fijo se especifica entre parentesis. Puede almacenar hasta 255 caracteres.
|
||||||
- **VARCHAR(Tamaño)**: Tiene una cadena de longitud variable (puede contener letras, numeros y caracteres especiales). El tamaño maximo se especifica entre parentesis. Puede almacenar hasta 255 caracteres.
|
- **VARCHAR(Tamaño)**: Tiene una cadena de longitud variable (puede contener letras, numeros y caracteres especiales). El tamaño maximo se especifica entre parentesis. Puede almacenar hasta 255 caracteres dependiendo del charset con `utf8mb4` puede almacenar hasta 65535 bytes (~16383 caracteres), aunque 255 es una práctica común.
|
||||||
- **TINYTEXT**: Tiene una cadena con una longitud maxima de 255 caracteres
|
- **TINYTEXT**: Tiene una cadena con una longitud maxima de 255 caracteres
|
||||||
- **TEXTO**: Tiene una cadena con una longitud maxima de 65535 caracteres.
|
- **TEXTO**: Tiene una cadena con una longitud maxima de 65535 caracteres.
|
||||||
- **BLOB**: Para BLOB (Objetos grandes binarios). Almacena hasta 65535 bytes de datos.
|
- **BLOB**: Para BLOB (Objetos grandes binarios). Almacena hasta 65535 bytes de datos.
|
||||||
@@ -40,12 +50,16 @@ Algunos de los tipos de datos basicos de SQL son:
|
|||||||
- **LONGBLOB**: Para BLOB (Objetos grandes binarios). Tiene una capacidad para 4294967295 bytes de datos.
|
- **LONGBLOB**: Para BLOB (Objetos grandes binarios). Tiene una capacidad para 4294967295 bytes de datos.
|
||||||
|
|
||||||
>[!bug]
|
>[!bug]
|
||||||
> Nota: Si, en VARCHAR, agregas un valor mas grande que 255, este se convertira en tipo TEXTO.
|
> Nota: Si, en VARCHAR, agregas un valor mas grande que 255, MySQL rechaza el INSERT.
|
||||||
|
|
||||||
|
---
|
||||||
## ENUM y SET
|
## ENUM y SET
|
||||||
- **Enum (x, y, z, etc.)**: Permite ingresar una lista de valores posibles. Puede enumerar hasta 65535 valores en una lista ENUM. Si se inserta un valor que no esta en la lista, se insertará un valor en blanco.
|
- **Enum (x, y, z, etc.)**: Permite ingresar una lista de valores posibles. Puede enumerar hasta 65535 valores en una lista ENUM. Inserta el primer valor del ENUM, o `''` si existe.
|
||||||
- **Set**: Similar a Enum, excepto que SET puede contener hasta 64 elementos de una lista y puede almacenar mas de opcion
|
- **Set**: Similar a Enum, excepto que SET puede contener hasta 64 elementos de una lista y puede almacenar mas de opcion
|
||||||
|
>[!bug]
|
||||||
|
>Nota: Si se inserta un valor no permitido, MariaDB inserta el primer valor del ENUM o una cadena vacía y lanza un warning.
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
## Binarios:
|
## Binarios:
|
||||||
- **bit** Entero que puede ser 0, 1 o NULL.
|
- **bit**: Tipo binario para almacenar Bits. No equivalente a BOOLEAN. Poco usado.
|
||||||
|
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
#SQL-ASIX - Structure Query Language
|
||||||
|
Proveniente de [[SQL]]
|
||||||
|
|
||||||
---
|
---
|
||||||
# Importar bases de datos
|
# Importar bases de datos
|
||||||
@@ -0,0 +1,123 @@
|
|||||||
|
#Temario-BSA - Bash Scripting Avanzado
|
||||||
|
Proveniente de [[Mecánica Unix - Manejo de la shell]]
|
||||||
|
|
||||||
|
---
|
||||||
|
## Control de flujo
|
||||||
|
---
|
||||||
|
### Condicionales `if`, `elif`, `else` y `fi`
|
||||||
|
```Shell
|
||||||
|
if [[ "$num" -gt 10 ]]; then
|
||||||
|
echo "Mayor que 10"
|
||||||
|
elif [[ "$num" -eq 10 ]]; then
|
||||||
|
echo "Es 10"
|
||||||
|
else
|
||||||
|
echo "Es menor que 10"
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `[[ . . . ]]`
|
||||||
|
```Shell
|
||||||
|
if [[ "$x" == "hola" && -n "$x" ]]; then
|
||||||
|
echo "coincide"
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `!` (negación)
|
||||||
|
``` Shell
|
||||||
|
if ! grep -q "hola" archivos.txt; then
|
||||||
|
echo "no existe hola"
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## `case...in...esac`
|
||||||
|
```Shell
|
||||||
|
case $option in
|
||||||
|
start) echo "iniciando";;
|
||||||
|
stop) echo "Finalizando";;
|
||||||
|
*) echo "Opción no válida";;
|
||||||
|
esac
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## `for, in, do, done` (Bucles)
|
||||||
|
```Shell
|
||||||
|
for i in 1 2 3; do
|
||||||
|
echo "numero $i"
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## `while, until` (Bucles condicionales)
|
||||||
|
```Shell
|
||||||
|
while [[ "$x" -lt 5 ]]; do
|
||||||
|
echo $x
|
||||||
|
((x++))
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
```Shell
|
||||||
|
until [[ "$x" -eq 5 ]]; do
|
||||||
|
echo $x
|
||||||
|
((x++))
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## `select` (Menú interactivo)
|
||||||
|
```Shell
|
||||||
|
select opcion in Start Stop Exit; do
|
||||||
|
echo "Elegiste la opcion $opcion"
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
## Contador de longitud
|
||||||
|
```Shell
|
||||||
|
validador() {
|
||||||
|
local passwd=$1
|
||||||
|
local long=${#passwd} # Para leer longitud de un dato, se usa ${#variable}
|
||||||
|
if [[ "$long" -gt 8 ]]; then
|
||||||
|
echo "PWD_GT_8"
|
||||||
|
else
|
||||||
|
echo "PWD_LT_8"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
### Verificación de mayúsculas, minúsculas, números y caracteres especiales
|
||||||
|
|
||||||
|
Se utiliza el comparador de valores regex (`=~`) en conjunto con los valores regex:
|
||||||
|
|
||||||
|
#### ¿Minúscula?
|
||||||
|
```Shell
|
||||||
|
[[ "Hola123" =~ [a-z] ]] # true
|
||||||
|
```
|
||||||
|
|
||||||
|
##### ¿Mayúscula?
|
||||||
|
```Shell
|
||||||
|
[[ "Hola123" =~ [A-Z] ]] # true
|
||||||
|
```
|
||||||
|
|
||||||
|
##### ¿Números?
|
||||||
|
```Shell
|
||||||
|
[[ "abc123def" =~ [0-9] ]] # true
|
||||||
|
```
|
||||||
|
|
||||||
|
###### ¿Caracteres especiales?
|
||||||
|
```Shell
|
||||||
|
[[ "asd1!213das" =~ [^a-zA-Z0-9] ]] # true
|
||||||
|
```
|
||||||
@@ -6,7 +6,268 @@ Proveniente de [[Funciones puras]]
|
|||||||
# 1. Calculadora modular
|
# 1. Calculadora modular
|
||||||
Objetivo: Separación de lógica (pura) del I/O (impuro).
|
Objetivo: Separación de lógica (pura) del I/O (impuro).
|
||||||
|
|
||||||
|
```Shell
|
||||||
|
#!/bin/bash
|
||||||
|
#Funciones Puras
|
||||||
|
suma() {
|
||||||
|
local num1=$1
|
||||||
|
local num2=$2
|
||||||
|
echo $(( $num1 + $num2 ))
|
||||||
|
}
|
||||||
|
|
||||||
|
resta() {
|
||||||
|
local num1=$1
|
||||||
|
local num2=$2
|
||||||
|
echo $(( $num1 - $num2 ))
|
||||||
|
}
|
||||||
|
|
||||||
Bibliografia Web:
|
multiplicacion() {
|
||||||
|
local num1=$1
|
||||||
|
local num2=$2
|
||||||
|
echo $(( $num1 * $num2 ))
|
||||||
|
}
|
||||||
|
|
||||||
|
division() {
|
||||||
|
local num1=$1
|
||||||
|
local num2=$2
|
||||||
|
if [[ "$num2" -eq 0 ]]; then
|
||||||
|
echo "ERROR_DIV_0"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
echo $(( $num1 / $num2 ))
|
||||||
|
}
|
||||||
|
|
||||||
|
#Menu
|
||||||
|
|
||||||
|
echo "Opciones posibles:"
|
||||||
|
echo "1. Sumar"
|
||||||
|
echo "2. Restar"
|
||||||
|
echo "3. Multiplicacion"
|
||||||
|
echo "4. Division"
|
||||||
|
read input
|
||||||
|
read -p "Introduce el primer numero: " a
|
||||||
|
read -p "Introduce el segundo numero: " b
|
||||||
|
|
||||||
|
case $input in
|
||||||
|
1) resultado=$(suma "$a" "$b");;
|
||||||
|
2) resultado=$(resta "$a" "$b");;
|
||||||
|
3) resultado=$(multiplicacion "$a" "$b");;
|
||||||
|
4) resultado=$(division "$a" "$b")
|
||||||
|
if [[ $b -eq 0 ]]; then
|
||||||
|
echo "No se puede dividir entre 0"
|
||||||
|
exit 1
|
||||||
|
fi;;
|
||||||
|
*)
|
||||||
|
echo "no valido"
|
||||||
|
exit 1;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
echo "Resultado = $resultado"
|
||||||
|
```
|
||||||
|
|
||||||
|
Bibliografía Web:
|
||||||
- [Manejo de errores en Bash Scripting](https://adictosalinux.com/manejo-errores-scripts-bash/)
|
- [Manejo de errores en Bash Scripting](https://adictosalinux.com/manejo-errores-scripts-bash/)
|
||||||
|
- [Comparator operators](https://www.tutorialkart.com/bash-shell-scripting/bash-comparison-operators/)
|
||||||
|
- [Funciones Bash](https://itsfoss.com/es/funciones-bash/)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 2. Validador de contraseñas
|
||||||
|
Entrada: Una contraseña.
|
||||||
|
Objetivo: Que detecte la longitud y cantidad de caracteres especiales y dará el diagnóstico `weak`, `mid` y `strong`.
|
||||||
|
|
||||||
|
```Shell
|
||||||
|
#!/bin/bash
|
||||||
|
# Funciones Puras
|
||||||
|
# En caso de muchos condicionales
|
||||||
|
# Recurrir a negaciones
|
||||||
|
longitud() {
|
||||||
|
local passwd=$1
|
||||||
|
local long=${#passwd}
|
||||||
|
if [[ "$long" -gt 8 ]]; then
|
||||||
|
echo "PWD_GT_8"
|
||||||
|
else
|
||||||
|
echo "PWD_LT_8"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
minusculas() {
|
||||||
|
local passwd=$1
|
||||||
|
if [[ "$passwd" =~ [a-z] ]]; then
|
||||||
|
echo "MINLETTERS"
|
||||||
|
else
|
||||||
|
echo "NO_MINLETTERS"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
mayusculas () {
|
||||||
|
local passwd=$1
|
||||||
|
if [[ "$passwd" =~ [A-Z] ]]; then
|
||||||
|
echo "MAYLETTERS"
|
||||||
|
else
|
||||||
|
echo "NO_MAYLETTERS"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
numeros () {
|
||||||
|
local passwd=$1
|
||||||
|
if [[ "$passwd" =~ [0-9] ]]; then
|
||||||
|
echo "NUMBERS"
|
||||||
|
else
|
||||||
|
echo "NO_NUMBERS"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
caracteresE () {
|
||||||
|
local passwd=$1
|
||||||
|
if [[ "$passwd" =~ [^a-zA-Z0-9] ]]; then #Caso curioso: Se recurre a la negacion, ya que si existe un
|
||||||
|
#caracter especial, este no estará en las tablas de mayuscula, minuscula ni numeros.
|
||||||
|
echo "ECARACTERS"
|
||||||
|
else
|
||||||
|
echo "NO_ECARACTERS"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
validador () {
|
||||||
|
local passwd=$1
|
||||||
|
local long=$(longitud "$passwd")
|
||||||
|
local min=$(minusculas "$passwd")
|
||||||
|
local may=$(mayusculas "$passwd")
|
||||||
|
local num=$(numeros "$passwd")
|
||||||
|
local carE=$(caracteresE "$passwd")
|
||||||
|
res=("$long" "$min" "$may" "$num" "$carE")
|
||||||
|
local puntuacion=0
|
||||||
|
local totcriterios=5
|
||||||
|
|
||||||
|
for i in "${res[@]}"; do
|
||||||
|
if [[ $i = "PWD_GT_8" || $i = "MINLETTERS" || $i = "MAYLETTERS" || $i = "NUMBERS" || $i = "ECARACTERS" ]]; then
|
||||||
|
((puntuacion++)) # Esto tiene un error de sintaxis aritmetica: Se esperaba un operando (el elemento de error es "+"). El error sale cuando no se introduce uno de los valores anteriores, como por ejemplo, no poner ningun simbolo.
|
||||||
|
#Update: EUREKA! Al poner $, bash expande el valor antes de la operacion aritmetica.
|
||||||
|
#Si la puntuacion vale 0, bash intenta ejecutar ((0++)).
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
((porcentaje=puntuacion * 100 / totcriterios))
|
||||||
|
if [[ "$porcentaje" -lt 41 ]]; then
|
||||||
|
echo "Weak"
|
||||||
|
elif [[ "$porcentaje" -lt 71 ]]; then
|
||||||
|
echo "Mid"
|
||||||
|
else
|
||||||
|
echo "Strong"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
read -p "Introduce una contraseña: " a
|
||||||
|
resultado=$(validador "$a" )
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
Bibliografía Web:
|
||||||
|
- [Conversión de mayúsculas a minúsculas](https://es.stackoverflow.com/questions/346567/cómo-convierto-un-texto-a-mayúsculas-o-minúsculas-en-bash-zsh-o-osx)
|
||||||
|
- [Using && and || in bash](https://kyleshevlin.com/using-and-and-or-in-bash-scripts/)
|
||||||
|
- [Bash operators](https://www.w3schools.com/bash/bash_operators.php)
|
||||||
|
|
||||||
|
|
||||||
|
# 3. Normalizador de nombres de archivos
|
||||||
|
---
|
||||||
|
Objetivo: Tener un nombre de archivo asqueroso y limpiarlo.
|
||||||
|
##### Ejemplo de entradas:
|
||||||
|
```Shell
|
||||||
|
" Hola Mundo.txt"
|
||||||
|
"Mi fichero (copia) (1).png"
|
||||||
|
```
|
||||||
|
|
||||||
|
- `normalizar_nombre` - Elimina espacios extra, pasa a minúsculas, reemplazo de espacios con `_`.
|
||||||
|
|
||||||
|
# 4. Parser de configuración estilo .ini
|
||||||
|
---
|
||||||
|
Objetivo: Procesar una línea. No se toca ficheros en la función pura.
|
||||||
|
##### Funciones puras:
|
||||||
|
- `es_comentario`
|
||||||
|
- `es_seccion`
|
||||||
|
- `obtener_clave`
|
||||||
|
- `obtener_valor`
|
||||||
|
##### Parte impura:
|
||||||
|
- Leer el archivo línea por línea
|
||||||
|
- Imprimir errores o configuraciones
|
||||||
|
|
||||||
|
Se entrena el patron: *la funcion pura opera en una linea, la impura itera por el fichero*.
|
||||||
|
|
||||||
|
# 5. Mini motor de templates
|
||||||
|
---
|
||||||
|
Objetivo: Reemplazo de variables del estilo:
|
||||||
|
```Shell
|
||||||
|
Hola {{NOMBRE}}
|
||||||
|
```
|
||||||
|
##### Funcion pura
|
||||||
|
- `renderizar_template "$template" "$nombre"`
|
||||||
|
Debe sustituir `{{NOMBRE}}` por el valor que le pasas.
|
||||||
|
##### Parte impura:
|
||||||
|
- Leer `.template`
|
||||||
|
- Guardar la salida en un fichero final.
|
||||||
|
|
||||||
|
Es composicion pura de texto, sin tocar nada externo.
|
||||||
|
|
||||||
|
# 6. Filtro de logs
|
||||||
|
---
|
||||||
|
Objetivo: Se procesa cada linea para extraer informacion util
|
||||||
|
##### Funciones puras
|
||||||
|
- `es_error`
|
||||||
|
- `extraer_fecha`
|
||||||
|
- `extraer_mensaje`
|
||||||
|
- `formato_limpio`
|
||||||
|
##### Parte impura
|
||||||
|
- Leer fichero de log gigante
|
||||||
|
- Guardar resultados filtrados
|
||||||
|
|
||||||
|
Procesamiento funcional de toda la vida. Muy util.
|
||||||
|
|
||||||
|
# 7. Comparador de versiones
|
||||||
|
---
|
||||||
|
Ejemplo:
|
||||||
|
```Shell
|
||||||
|
compare_versions "1.2.10" "1.3.1"
|
||||||
|
```
|
||||||
|
##### Salida pura:
|
||||||
|
- `-1` si v1 < `v2`
|
||||||
|
- `0` si iguales
|
||||||
|
- `1` si `v1` > `v2`
|
||||||
|
##### Parte impura
|
||||||
|
- Nada mas que capturar valores y mostrar los resultados.
|
||||||
|
|
||||||
|
Perfecto para practicar manejo de arrays y logica sin tocar sistema.
|
||||||
|
|
||||||
|
# 8. Generador de checksums "puro"
|
||||||
|
---
|
||||||
|
No se calcula archivos, solo texto.
|
||||||
|
##### Funciones puras
|
||||||
|
- `checksum_simple "$texto"` - Ejemplo: suma ASCII mod 10000
|
||||||
|
- `hash_basico "$texto"`
|
||||||
|
##### Parte impura
|
||||||
|
- Leer ficheros desde disco
|
||||||
|
- Pasar su contenido a la parte pura
|
||||||
|
|
||||||
|
Obliga a pensar que es pureza y que no.
|
||||||
|
|
||||||
|
# 9. Conversor de fecha
|
||||||
|
---
|
||||||
|
Convierte formatos
|
||||||
|
Entrada:
|
||||||
|
```shell
|
||||||
|
2025-12-10
|
||||||
|
```
|
||||||
|
Salida de funcion pura:
|
||||||
|
```shell
|
||||||
|
10/12/2025
|
||||||
|
```
|
||||||
|
##### Impuro
|
||||||
|
Nada fuera de imprimir resultados
|
||||||
|
|
||||||
|
Es un ejemplo simple para disciplina.
|
||||||
|
|
||||||
|
|
||||||
|
# 10. Mini-linter para Bash
|
||||||
|
---
|
||||||
|
Suena más grande de lo que es.
|
||||||
|
##### Funcion pura
|
||||||
|
- `analizar_linea "$linea"` - Devuelve etiquetas como `"echo esta mal"`, `"mal identado"`, `"ok"`.
|
||||||
|
###### Funcion impura
|
||||||
|
- Leer archivo `.sh`
|
||||||
|
- Contar errores
|
||||||
|
- Mostrar resumen
|
||||||
|
|
||||||
|
Mola detectar mierda en los scripts. Tambien fuerza a separar analisis puro de acciones impuras.
|
||||||
@@ -1,44 +1,62 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
#Funciones Puras
|
||||||
|
suma() {
|
||||||
|
local num1=$1
|
||||||
|
local num2=$2
|
||||||
|
echo $(( $num1 + $num2))
|
||||||
|
}
|
||||||
|
|
||||||
|
resta() {
|
||||||
|
local num1=$1
|
||||||
|
local num2=$2
|
||||||
|
echo $(( $num1 - $num2))
|
||||||
|
}
|
||||||
|
|
||||||
|
multiplicacion() {
|
||||||
|
local num1=$1
|
||||||
|
local num2=$2
|
||||||
|
echo $(( $num1 * $num2))
|
||||||
|
}
|
||||||
|
|
||||||
|
division() {
|
||||||
|
local num1=$1
|
||||||
|
local num2=$2
|
||||||
|
if [[ "$num2" -eq 0 ]]; then
|
||||||
|
echo "ERROR_DIV_0"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
echo $(( $num1 / $num2))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Menu
|
||||||
echo "Opciones posibles:"
|
echo "Opciones posibles:"
|
||||||
echo "1. Sumar"
|
echo "1. Sumar"
|
||||||
echo "2. Restar"
|
echo "2. Restar"
|
||||||
echo "3. Multiplicacion"
|
echo "3. Multiplicacion"
|
||||||
echo "4. Division"
|
echo "4. Division"
|
||||||
read input
|
read input
|
||||||
|
|
||||||
|
read -p "Introduce el primer numero: " a
|
||||||
|
read -p "Introduce el segundo numero: " b
|
||||||
|
|
||||||
case $input in
|
case $input in
|
||||||
1) $suma;;
|
1) resultado=$(suma "$a" "$b");;
|
||||||
2) $resta;;
|
2) resultado=$(resta "$a" "$b");;
|
||||||
3) $multiplicacion;;
|
3) resultado=$(multiplicacion "$a" "$b");;
|
||||||
4) $division;;
|
4) resultado=$(division "$a" "$b")
|
||||||
|
if [[ $b -eq 0 ]]; then
|
||||||
|
echo "No se puede dividir entre 0"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "no valido"
|
||||||
|
exit 1;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
echo "Resultado = $resultado"
|
||||||
|
|
||||||
suma() {
|
|
||||||
local num1=$1
|
|
||||||
local num2=$2
|
|
||||||
echo $(( $1 + $2))
|
|
||||||
}
|
|
||||||
|
|
||||||
resta() {
|
|
||||||
local num1=$1
|
|
||||||
local num2=$2
|
|
||||||
echo $(( $1 - $2))
|
|
||||||
}
|
|
||||||
|
|
||||||
multiplicacion() {
|
|
||||||
local num1=$1
|
|
||||||
local num2=$2
|
|
||||||
echo $(( $1 * $2))
|
|
||||||
}
|
|
||||||
|
|
||||||
division() {
|
|
||||||
local num1=$1
|
|
||||||
local num2=$2
|
|
||||||
if [[ "$2" -eq 0 ]]; then
|
|
||||||
echo "ERROR_DIV_0"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
echo $(( $1 / $2))
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,81 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Funciones Puras
|
||||||
|
# En caso de muchos condicionales
|
||||||
|
# Recurrir a negaciones
|
||||||
|
longitud() {
|
||||||
|
local passwd=$1
|
||||||
|
local long=${#passwd}
|
||||||
|
if [[ "$long" -gt 8 ]]; then
|
||||||
|
echo "PWD_GT_8"
|
||||||
|
else
|
||||||
|
echo "PWD_LT_8"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
minusculas() {
|
||||||
|
local passwd=$1
|
||||||
|
if [[ "$passwd" =~ [a-z] ]]; then
|
||||||
|
echo "MINLETTERS"
|
||||||
|
else
|
||||||
|
echo "NO_MINLETTERS"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
mayusculas () {
|
||||||
|
local passwd=$1
|
||||||
|
if [[ "$passwd" =~ [A-Z] ]]; then
|
||||||
|
echo "MAYLETTERS"
|
||||||
|
else
|
||||||
|
echo "NO_MAYLETTERS"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
numeros () {
|
||||||
|
local passwd=$1
|
||||||
|
if [[ "$passwd" =~ [0-9] ]]; then
|
||||||
|
echo "NUMBERS"
|
||||||
|
else
|
||||||
|
echo "NO_NUMBERS"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
caracteresE () {
|
||||||
|
local passwd=$1
|
||||||
|
if [[ "$passwd" =~ [^a-zA-Z0-9] ]]; then #Caso curioso: Se recurre a la negacion, ya que si existe un
|
||||||
|
#caracter especial, este no estará en las tablas de mayuscula, minuscula ni numeros.
|
||||||
|
echo "ECARACTERS"
|
||||||
|
else
|
||||||
|
echo "NO_ECARACTERS"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
validador () {
|
||||||
|
local passwd=$1
|
||||||
|
local long=$(longitud "$passwd")
|
||||||
|
local min=$(minusculas "$passwd")
|
||||||
|
local may=$(mayusculas "$passwd")
|
||||||
|
local num=$(numeros "$passwd")
|
||||||
|
local carE=$(caracteresE "$passwd")
|
||||||
|
res=("$long" "$min" "$may" "$num" "$carE")
|
||||||
|
local puntuacion=0
|
||||||
|
local totcriterios=5
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
for i in "${res[@]}"; do
|
||||||
|
if [[ $i = "PWD_GT_8" || $i = "MINLETTERS" || $i = "MAYLETTERS" || $i = "NUMBERS" || $i = "ECARACTERS" ]]; then
|
||||||
|
((puntuacion++)) # Esto tiene un error de sintaxis aritmetica: Se esperaba un operando (el elemento de error es "+"). El error sale cuando no se introduce uno de los valores anteriores, como por ejemplo, no poner ningun simbolo.
|
||||||
|
#Update: EUREKA! Al poner $, bash expande el valor antes de la operacion aritmetica.
|
||||||
|
#Si la puntuacion vale 0, bash intenta ejecutar ((0++)).
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
((porcentaje=puntuacion * 100 / totcriterios))
|
||||||
|
if [[ "$porcentaje" -lt 41 ]]; then
|
||||||
|
echo "Weak"
|
||||||
|
elif [[ "$porcentaje" -lt 71 ]]; then
|
||||||
|
echo "Mid"
|
||||||
|
else
|
||||||
|
echo "Strong"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
read -p "Introduce una contraseña: " a
|
||||||
|
resultado=$(validador "$a" )
|
||||||
|
|
||||||
|
echo "Su contraseña es $resultado"
|
||||||
@@ -125,3 +125,4 @@ Tal vez pienses que es más trabajo, pero los beneficios son enormes:
|
|||||||
1. **La depuración es más sencilla**: Si algo, por alguna razón, falla, sabes que el error está *dentro* de ella o en los argumentos que recibió. No tienes que rastrear variables globales por todo el fichero.
|
1. **La depuración es más sencilla**: Si algo, por alguna razón, falla, sabes que el error está *dentro* de ella o en los argumentos que recibió. No tienes que rastrear variables globales por todo el fichero.
|
||||||
2. **Reutilización**: Puedes hacer *copy-paste* de una función pura en otro script y funcionará inmediatamente sin romper nada (en la gran mayoría de casos).
|
2. **Reutilización**: Puedes hacer *copy-paste* de una función pura en otro script y funcionará inmediatamente sin romper nada (en la gran mayoría de casos).
|
||||||
3. **Seguridad**: Evita las colisiones de nombres de variables (el típico error donde dos bucles usan la variable `i` y uno rompe al otro).
|
3. **Seguridad**: Evita las colisiones de nombres de variables (el típico error donde dos bucles usan la variable `i` y uno rompe al otro).
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,11 @@
|
|||||||
En este apartado, me dedico a aprender todo lo que tiene que ver con la terminal. Pondré obviamente apuntes sobre lo que ya sé y sobre lo que no.
|
#Temario-BSA - Bash Scripting Avanzado
|
||||||
|
Documento Padre
|
||||||
# Lo que voy a apuntar va a ser:
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
En este apartado, me dedico a aprender todo lo que tiene que ver con la terminal. Pondré obviamente apuntes sobre lo que ya sé y sobre lo que no.
|
||||||
|
|
||||||
|
## Lo que voy a apuntar va a ser:
|
||||||
|
|
||||||
### 1. Bash Scripting Avanzado
|
### 1. Bash Scripting Avanzado
|
||||||
Aquí no se va a tratar solo de escribir scripts, sino de:
|
Aquí no se va a tratar solo de escribir scripts, sino de:
|
||||||
- [[Funciones puras]]
|
- [[Funciones puras]]
|
||||||
@@ -62,6 +65,12 @@ Aquí no se va a tratar solo de escribir scripts, sino de:
|
|||||||
*Y esto aporta:*
|
*Y esto aporta:*
|
||||||
Analisis de **Big Data** chapucero, pero cumpliré con la función.
|
Analisis de **Big Data** chapucero, pero cumpliré con la función.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 6. Cosillas extras
|
||||||
|
- [[Extra|Extras]], para apuntar cosas cuando se me olvidan o cosas que voy aprendiendo con el tiempo.
|
||||||
|
|
||||||
|
---
|
||||||
### Cuál es el objetivo de esto:
|
### Cuál es el objetivo de esto:
|
||||||
Aprender y profundizar aún más en lo que ya sé y conozco. Tengo pensado dedicarle aproximadamente entre 1 y 2 meses solo a esto.
|
Aprender y profundizar aún más en lo que ya sé y conozco. Tengo pensado dedicarle aproximadamente entre 1 y 2 meses solo a esto.
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,114 @@
|
|||||||
|
#LilCMS-JS
|
||||||
|
|
||||||
|
LilCMS.JS es, como su nombre indica, un CMS de creación propia basado en node.js y JavaScript. Es un sistema de renderizado en cliente (*Client-Side Rendering*). El repositorio original es este:
|
||||||
|
### - [LilCMS - A personal-made CMS](https://github.com/Lil-Carpi/LilCMS)
|
||||||
|
### TENED EN CUENTA:
|
||||||
|
- La versión original estará hecha en `PHP`, un lenguaje deprogramaciónn queaúnn no controlo.
|
||||||
|
|
||||||
|
El repositorio de ESTE proyecto será
|
||||||
|
### - [LilCMS.JS - A personal-made CMS, but on JavaScript](https://github.com/Lil-Carpi/LilCMS.js)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
La idea es simple: Crear un Gestor de contenidos simple, útil e intuitivo, en el cual se puedan definir diferentes elementos (web components) para cada cosa, como footer, content, headers, navbar, etc.
|
||||||
|
|
||||||
|
El motor de base de datos para la gestión de usuarios será MariaDB.
|
||||||
|
|
||||||
|
Estructura de ficheros (Base):
|
||||||
|
```
|
||||||
|
.
|
||||||
|
├── assets
|
||||||
|
│ ├── css
|
||||||
|
│ ├── fonts
|
||||||
|
│ ├── img
|
||||||
|
│ └── js
|
||||||
|
│ └── web-component.js
|
||||||
|
├── favicon.ico
|
||||||
|
├── index.html
|
||||||
|
├── main
|
||||||
|
│ └── components
|
||||||
|
│ ├── content.html
|
||||||
|
│ └── footer.html
|
||||||
|
└── private
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
- **/assets**: Directorio contenedor de CSS, fuentes, imágenes a ser necesario y ficheros JS.
|
||||||
|
- **/main**: Directorio contenedor de componentes de la página web. Estos sirven para ser insertados mediante web-component.js al index.html principal.
|
||||||
|
- **/private**: Directorio contenedor experimental. Probablemente segurizado mediante identificación por servidor SQL.
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
## Contenido importante por el momento:
|
||||||
|
|
||||||
|
### `/index.html`
|
||||||
|
```HTML
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Document</title>
|
||||||
|
<script src="/assets/js/web-component.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Desde index</h1>
|
||||||
|
<mi-content></mi-content>
|
||||||
|
<mi-footer></mi-footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
```
|
||||||
|
|
||||||
|
### `/main/components/content.html`
|
||||||
|
```HTML
|
||||||
|
<h1>Contenido</h1>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>Poco texto</p>
|
||||||
|
<p>Mucho texto</p>
|
||||||
|
<p>Medio texto</p>
|
||||||
|
<p>Completo texto</p>
|
||||||
|
<p>Final de texto</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### `/main/components/footer.html`
|
||||||
|
```HTML
|
||||||
|
<h1>Contenido</h1>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>Poco texto</p>
|
||||||
|
<p>Mucho texto</p>
|
||||||
|
<p>Medio texto</p>
|
||||||
|
<p>Completo texto</p>
|
||||||
|
<p>Final de texto</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### `/assets/js/web-components.js`
|
||||||
|
```JavaScript
|
||||||
|
class MiFooter extends HTMLElement {
|
||||||
|
connectedCallback() {
|
||||||
|
fetch('../main/components/footer.html')
|
||||||
|
.then(r => r.text())
|
||||||
|
.then(html => this.innerHTML = html);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
customElements.define('mi-footer', MiFooter);
|
||||||
|
|
||||||
|
class MiContent extends HTMLElement {
|
||||||
|
connectedCallback() {
|
||||||
|
fetch('../main/components/content.html')
|
||||||
|
.then(r => r.text())
|
||||||
|
.then(html => this.innerHTML = html);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
customElements.define('mi-content', MiContent);
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
#LilCMS-JS
|
||||||
|
En esta versión, he conseguido crear el back-end con `node.js`. En un principio, he conseguido hacerlo funcionar mediante web components HTML, Después he conseguido conectar una base de datos externa al back-end para que interactúe con el usuario admin, dando el siguiente resultado:
|
||||||
|
```JSON
|
||||||
|
{"mensaje":"¡Conexión exitosa con MariaDB!",
|
||||||
|
"datos":
|
||||||
|
[{"id":1,
|
||||||
|
"username":"admin",
|
||||||
|
"password":"1234",
|
||||||
|
"role":"admin",
|
||||||
|
"created_at":"2025-12-15T22:56:03.000Z"}]}
|
||||||
|
```
|
||||||
|
|
||||||
|
Así que, podemos concluir, que la versión 0.0.1 está terminada.
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
#LilCMS-JS
|
||||||
BIN
Imagenes/SQL/Mezcla-cartesiana_(CROSS_JOIN).png
Normal file
BIN
Imagenes/SQL/Mezcla-cartesiana_(CROSS_JOIN).png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 85 KiB |
4
Programación/HTML y CSS/CSS/LDM - CSS.md
Normal file
4
Programación/HTML y CSS/CSS/LDM - CSS.md
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
#LDM-CSS - CSS
|
||||||
|
Documento Padre
|
||||||
|
|
||||||
|
---
|
||||||
4
Programación/HTML y CSS/HTML/LDM - HTML.md
Normal file
4
Programación/HTML y CSS/HTML/LDM - HTML.md
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
#LDM-HTML - HTML
|
||||||
|
Documento Padre
|
||||||
|
|
||||||
|
---
|
||||||
6
Programación/JavaScript/LDM-JavaScript.md
Normal file
6
Programación/JavaScript/LDM-JavaScript.md
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
#LDM-JavaScript - Programación JavaScript
|
||||||
|
Documento Padre
|
||||||
|
|
||||||
|
---
|
||||||
|
### Documento Padre.
|
||||||
|
|
||||||
7
Programación/PHP/M9-PHP.md
Normal file
7
Programación/PHP/M9-PHP.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
#M9-PHP - Programación PHP
|
||||||
|
Documento Padre
|
||||||
|
|
||||||
|
---
|
||||||
|
### Documento padre de PHP
|
||||||
|
|
||||||
|
Documentos Hijos:
|
||||||
8
Programación/Python/Python.md
Normal file
8
Programación/Python/Python.md
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#Python Programación Python
|
||||||
|
Documento Padre
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Documento padre de Python.
|
||||||
|
|
||||||
|
Documentos hijos:
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
# Bienvenido a mis notas
|
# Bienvenido a mis notas
|
||||||
---
|
---
|
||||||
Soy Carpi, este es mi espacio Gitea. Aquí cuelgo notas, trabajos, proyectos y cualquier cosa que me sirva para estudiar o trabajar. Si algo te es útil, adelante. Bienvenido eres (referencia).
|
Soy Carpi, este es mi espacio Gitea. Aquí cuelgo notas, trabajos, proyectos y cualquier cosa que me sirva para estudiar o trabajar. Si algo te es útil, adelante. Bienvenido eres.
|
||||||
|
|
||||||
---
|
---
|
||||||
# Temarios
|
# Temarios
|
||||||
@@ -73,4 +73,3 @@ iOS tampoco deja clonar repos... Ni hacer nada en general, usa la copia en Andro
|
|||||||
|
|
||||||
---
|
---
|
||||||
Abrís Obsidian y buscáis donde hayáis descargado el repo y listo.
|
Abrís Obsidian y buscáis donde hayáis descargado el repo y listo.
|
||||||
(No me lo confundas con el juego. O sí, pero luego no digas que no furula).
|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
#M5-ASIX
|
||||||
## ASIX1A - M5 - Sebastian Ariel Duarte Oruez
|
## ASIX1A - M5 - Sebastian Ariel Duarte Oruez
|
||||||
### 10/12/25
|
### 10/12/25
|
||||||
Fet en Obsidian / Markdown
|
Fet en Obsidian / Markdown
|
||||||
10
Servidores/M5/M5 - ASIX.md
Normal file
10
Servidores/M5/M5 - ASIX.md
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
#M5-ASIX - Montaje de servidores
|
||||||
|
Documento Padre
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[^1]: Documentos hijos:
|
||||||
|
- [[M5RA2P1]]
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
# Conflicts
|
|
||||||
Please resolve them and commit them using the commands `Git: Commit all changes` followed by `Git: Push`
|
|
||||||
(This file will automatically be deleted before commit)
|
|
||||||
[[#Additional Instructions]] available below file list
|
|
||||||
|
|
||||||
- Not a file: .obsidian/workspace.json
|
|
||||||
|
|
||||||
# Additional Instructions
|
|
||||||
I strongly recommend to use "Source mode" for viewing the conflicted files. For simple conflicts, in each file listed above replace every occurrence of the following text blocks with the desired text.
|
|
||||||
|
|
||||||
```diff
|
|
||||||
<<<<<<< HEAD
|
|
||||||
File changes in local repository
|
|
||||||
=======
|
|
||||||
File changes in remote repository
|
|
||||||
>>>>>>> origin/main
|
|
||||||
```
|
|
||||||
Reference in New Issue
Block a user