Compare commits

..

28 Commits

Author SHA1 Message Date
3b534f5f1f vault backup: 2026-01-12 00:35:30 2026-01-12 00:35:30 +01:00
5c93796a8d vault backup: 2025-12-27 17:48:05 2025-12-27 17:48:05 +01:00
dd282a64ac vault backup: 2025-12-17 20:31:17 2025-12-17 20:31:17 +01:00
314c84cd90 Añadido el apartado Proyectos.
Añadido el proyecto LilCMS.JS en proyectos
Añadido las notas de versión 0.0.1 de LilCMS.JS
2025-12-16 18:48:00 +01:00
75ec755378 vault backup: 2025-12-16 01:18:48 2025-12-16 01:18:48 +01:00
ccbc2f4a29 vault backup: 2025-12-16 00:07:49 2025-12-16 00:07:49 +01:00
9b83a7a6bb Creado Apuntes generales de SQL 2025-12-15 01:07:57 +01:00
58f69d5330 Creado la carpeta de tecnicisomos y Uso general en SQL.
Creado Notas para clase en SQL.
2025-12-14 22:00:26 +01:00
660e4aed75 Disparadores 2025-12-14 17:51:15 +01:00
845ac5c3aa lista de actividades 2025-12-14 02:03:14 +01:00
296a9644c4 Validador de contraseñas completado. 2025-12-14 01:36:11 +01:00
424f765ef6 Cambios en el readme 2025-12-13 22:00:11 +01:00
d5afc2358c Procedimientos almacenados y disparadores. 2025-12-13 21:34:23 +01:00
58150b984f vault backup: 2025-12-12 22:34:40 2025-12-12 22:34:40 +01:00
b6bd7ab8e8 vault backup: 2025-12-12 17:45:02 2025-12-12 17:45:02 +01:00
539b853443 vault backup: 2025-12-12 16:16:32 2025-12-12 16:16:32 +01:00
c4e434d919 vault backup: 2025-12-12 15:58:00 2025-12-12 15:58:00 +01:00
b623e68c5e vault backup: 2025-12-12 15:23:40 2025-12-12 15:23:40 +01:00
0e83a49bc9 Vault backup 2025-12-12 15:23:16 +01:00
ed446a8469 vault backup: 2025-12-12 15:22:45 2025-12-12 15:22:45 +01:00
b8e6eb7588 Cambios en el README 2025-12-12 13:06:55 +00:00
Lil_Carpi
174ea9eab7 vault backup: 2025-12-11 17:42:41 2025-12-11 17:42:41 +01:00
be701009ba vault backup: 2025-12-11 17:33:13 2025-12-11 17:33:13 +01:00
717066ff88 vault backup: 2025-12-11 01:42:15 2025-12-11 01:42:15 +01:00
8d2c3cdc66 vault backup: 2025-12-11 00:59:43 2025-12-11 00:59:43 +01:00
122462f3eb vault backup: 2025-12-10 23:37:50 2025-12-10 23:37:50 +01:00
3bdd11ec1b vault backup {{date}} 2025-12-10 23:37:27 +01:00
a024d99e30 vault backup: 2025-12-10 23:34:33 2025-12-10 23:34:33 +01:00
50 changed files with 31017 additions and 150 deletions

View File

@@ -1,5 +1,8 @@
{
"accentColor": "#9600ff",
"theme": "system",
"cssTheme": "Adwaita"
"cssTheme": "Adwaita",
"enabledCssSnippets": [
"pgbrk"
]
}

View File

@@ -1,5 +1,7 @@
[
"obsidian-git",
"languagetool",
"oz-calendar"
"oz-calendar",
"better-export-pdf",
"automatic-table-of-contents"
]

59
.obsidian/graph.json vendored
View File

@@ -1,46 +1,81 @@
{
"collapse-filter": true,
"collapse-filter": false,
"search": "",
"showTags": false,
"showAttachments": false,
"hideUnresolved": false,
"showOrphans": true,
"collapse-color-groups": false,
"collapse-color-groups": true,
"colorGroups": [
{
"query": "SQL",
"query": "tag:#SQL-ASIX ",
"color": {
"a": 1,
"rgb": 16514816
"rgb": 16776960
}
},
{
"query": "file:\"Mecánica Unix - Manejo de la shell\"",
"query": "tag:#M9-PHP ",
"color": {
"a": 1,
"rgb": 16762711
"rgb": 7292927
}
},
{
"query": "section:(#Temario-BSA)",
"query": "tag:#Python ",
"color": {
"a": 1,
"rgb": 8927487
"rgb": 255
}
},
{
"query": "section:(#Temario-ASG)",
"query": "tag:#Temario-ASG ",
"color": {
"a": 1,
"rgb": 5431378
}
},
{
"query": "file:\"README.md\"",
"query": "tag:#Temario-BSA ",
"color": {
"a": 1,
"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,
@@ -48,11 +83,11 @@
"textFadeMultiplier": 0,
"nodeSizeMultiplier": 1,
"lineSizeMultiplier": 1,
"collapse-forces": true,
"collapse-forces": false,
"centerStrength": 0.518713248970312,
"repelStrength": 10,
"linkStrength": 1,
"linkDistance": 250,
"scale": 0.19753086419753052,
"scale": 0.23309818327823928,
"close": true
}

View File

@@ -6,5 +6,14 @@
],
"key": "AltGraph"
}
],
"editor:insert-codeblock": [
{
"modifiers": [
"Mod",
"Shift"
],
"key": "C"
}
]
}

View File

@@ -0,0 +1,13 @@
// Automatic Table Of Contents 1.7.3 (https://github.com/johansatge)
var c=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var d=c((ee,k)=>{var g=class{},p={},v=class{},w=t=>t;if(A()){let t=require("obsidian");g=t.Plugin,p=t.MarkdownRenderer,v=t.MarkdownRenderChild,w=t.htmlToMarkdown}k.exports={Plugin:g,MarkdownRenderer:p,MarkdownRenderChild:v,htmlToMarkdown:w};function A(){return typeof process!="object"?!0:!process.env||!process.env.JEST_WORKER_ID}});var y=c((re,b)=>{var s={title:{type:"string",default:"",comment:""},style:{type:"value",default:"nestedList",values:["nestedList","nestedOrderedList","inlineFirstLevel"],comment:"TOC style (nestedList|nestedOrderedList|inlineFirstLevel)"},minLevel:{type:"number",default:0,comment:"Include headings from the specified level"},maxLevel:{type:"number",default:0,comment:"Include headings up to the specified level"},include:{type:"regexp",default:null,comment:""},exclude:{type:"regexp",default:null,comment:""},includeLinks:{type:"boolean",default:!0,comment:"Make headings clickable"},hideWhenEmpty:{type:"boolean",default:!1,comment:"Hide TOC if no headings are found"},debugInConsole:{type:"boolean",default:!1,comment:"Print debug info in Obsidian console"}};b.exports={getOptionsDocs:P,parseOptionsFromSourceText:E};function P(){let t=[];for(let e of Object.keys(s)){let n=s[e],r=n.comment.length>0?` # ${n.comment}`:"",o=n.default!==null?n.default:"";t.push(`${e}: ${o}${r}`)}return t.join(`
`)}function E(t=""){let e={};for(let n of Object.keys(s))e[n]=s[n].default;for(let n of t.split(`
`)){let r=R(n);r!==null&&(e[r.name]=r.value)}return e}function R(t){let e=t.match(/([a-zA-Z0-9._ ]+):(.*)/);if(t.startsWith("#")||!e)return null;let n=e[1].trim(),r=s[n],o=e[2].trim();(!r||!["string","regexp"].includes(r.type))&&(o=o.replace(/#[^#]*$/,"").trim());let a=new Error(`Invalid value for \`${n}\``);if(r&&r.type==="number"){let i=Number.parseInt(o);if(i<0)throw a;return{name:n,value:i}}if(r&&r.type==="boolean"){if(!["true","false"].includes(o))throw a;return{name:n,value:o==="true"}}if(r&&r.type==="value"){if(!r.values.includes(o))throw a;return{name:n,value:o}}if(r&&r.type==="string")return{name:n,value:o};if(r&&r.type==="regexp"){if(o==="null"||o.length===0)return null;try{let i=/^\/(.*)\/([a-z]*)/.exec(o);if(!i)throw new Error("Invalid regexp");let l=new RegExp(i[1],i[2]);return{name:n,value:l}}catch{throw a}}return null}});var x=c((oe,L)=>{var{htmlToMarkdown:S}=d();L.exports={isHeadingAllowed:_,getFormattedMarkdownHeading:W};function _(t,e){return e.include?e.include.test(t):e.exclude?!e.exclude.test(t):!0}function W(t,e){if(e.includeLinks){let n=t;n=$(n),n=j(n),n=M(n,!1);let r=t;return r=M(r,!0),r=q(r),`[[#${r}|${n}]]`}return t}function $(t){return t.replaceAll("*","").replaceAll(/(\W|^)_+(\S)(.*?\S)?_+(\W|$)/g,"$1$2$3$4").replaceAll("`","").replaceAll("==","").replaceAll("~~","").replace(/\[([^\]]+)\]\([^)]+\)/g,"$1")}function j(t){return $(S(t))}function M(t,e){return t.replace(/\[\[([^\]]+)\|([^\]]+)\]\]/g,e?"$1 $2":"$2").replace(/\[\[([^\]]+)\]\]/g,"$1").replaceAll("[[","").replaceAll("| ",e?"":"- ").replaceAll("|",e?" ":"-")}function q(t){return t.replaceAll("#"," ")}});var F=c((le,H)=>{var{isHeadingAllowed:C,getFormattedMarkdownHeading:I}=x();H.exports={getMarkdownFromHeadings:N};function N(t,e){let n={nestedList:D,nestedOrderedList:B,inlineFirstLevel:z},r="";if(e.title&&e.title.length>0){let a=e.style==="inlineFirstLevel"?" ":`
`;r+=`${e.title}${a}`}let o=n[e.style](t,e);return o===null?e.hideWhenEmpty?"":`${r}_Table of contents: no headings found_`:r+o}function D(t,e){return O(t,!1,e)}function B(t,e){return O(t,!0,e)}function O(t,e,n){let r=e?"1.":"-",o=[],a=n.minLevel>0?n.minLevel:Math.min(...t.map(l=>l.level)),i=0;for(let l of t)if(!(i>0&&l.level>i)){if(l.level<=i&&(i=0),!C(l.heading,n)){i=l.level;continue}l.level<a||n.maxLevel>0&&l.level>n.maxLevel||l.heading.length!==0&&o.push(`${" ".repeat(l.level-a)}${r} ${I(l.heading,n)}`)}return o.length>0?o.join(`
`):null}function z(t,e){let n=e.minLevel>0?e.minLevel:Math.min(...t.map(o=>o.level)),r=t.filter(o=>o.level===n).filter(o=>o.heading.length>0).filter(o=>C(o.heading,e)).map(o=>I(o.heading,e));return r.length>0?r.join(" | "):null}});var{Plugin:J,MarkdownRenderer:T,MarkdownRenderChild:K}=d(),{getOptionsDocs:V,parseOptionsFromSourceText:Z}=y(),{getMarkdownFromHeadings:G}=F(),h="table-of-contents",Q="toc",m=class extends J{async onload(){let e=(n,r,o)=>{o.addChild(new f(this.app,r,o.sourcePath,n))};this.registerMarkdownCodeBlockProcessor(h,e),this.registerMarkdownCodeBlockProcessor(Q,e),this.addCommand({id:"insert-automatic-table-of-contents",name:"Insert table of contents",editorCallback:U}),this.addCommand({id:"insert-automatic-table-of-contents-docs",name:"Insert table of contents (with available options)",editorCallback:X})}};function U(t){let e=`\`\`\`${h}
\`\`\``;t.replaceRange(e,t.getCursor())}function X(t){let e=[`\`\`\`${h}
${V()}
\`\`\``];t.replaceRange(e.join(`
`),t.getCursor())}var f=class extends K{constructor(e,n,r,o){super(n),this.app=e,this.element=n,this.sourcePath=r,this.sourceText=o}onload(){this.render(),this.registerEvent(this.app.metadataCache.on("changed",this.onMetadataChange.bind(this)))}onMetadataChange(){this.render()}render(){try{let e=Z(this.sourceText);e.debugInConsole&&u("Options",e);let n=this.app.metadataCache.getCache(this.sourcePath),r=n?.headings?n.headings:[];e.debugInConsole&&u("Headings",r);let o=G(r,e);e.debugInConsole&&u("Markdown",o),this.element.empty(),T.renderMarkdown(o,this.element,this.sourcePath,this)}catch(e){let n=`_\u{1F4A5} Could not render table of contents (${e.message})_`;T.renderMarkdown(n,this.element,this.sourcePath,this)}}};function u(t,e){console.log(`%cAutomatic Table Of Contents %c${t}:
`,"color: orange; font-weight: bold","font-weight: bold",e)}module.exports=m;
/* nosourcemap */

View File

@@ -0,0 +1,10 @@
{
"id": "automatic-table-of-contents",
"name": "Automatic Table Of Contents",
"version": "1.7.3",
"minAppVersion": "1.3.0",
"description": "Create a table of contents in a note, that updates itself when the note changes",
"author": "Johan Satgé",
"authorUrl": "https://github.com/johansatge",
"isDesktopOnly": false
}

View File

@@ -0,0 +1,30 @@
{
"showTitle": true,
"maxLevel": "6",
"displayHeader": true,
"displayFooter": true,
"headerTemplate": "<div style=\"width: 100vw;font-size:10px;text-align:center;\"><span class=\"title\"></span></div>",
"footerTemplate": "<div style=\"width: 100vw;font-size:10px;text-align:center;\"><span class=\"pageNumber\"></span> / <span class=\"totalPages\"></span></div>",
"printBackground": false,
"generateTaggedPDF": false,
"displayMetadata": false,
"debug": false,
"isTimestamp": false,
"enabledCss": false,
"concurrency": "5",
"prevConfig": {
"pageSize": "A4",
"marginType": "1",
"showTitle": true,
"open": true,
"scale": 100,
"landscape": false,
"marginTop": "10",
"marginBottom": "10",
"marginLeft": "10",
"marginRight": "10",
"displayHeader": true,
"displayFooter": true,
"cssSnippet": "0"
}
}

25940
.obsidian/plugins/better-export-pdf/main.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,11 @@
{
"id": "better-export-pdf",
"name": "Better Export PDF",
"version": "1.11.0",
"minAppVersion": "0.15.0",
"description": "Export your notes to PDF, support export preview, add bookmarks outline and header/footer.",
"author": "l1xnan",
"authorUrl": "https://github.com/l1xnan",
"fundingUrl": "https://www.buymeacoffee.com/l1xnan",
"isDesktopOnly": true
}

View File

@@ -0,0 +1,67 @@
#better-export-pdf {
display: flex;
flex-direction: row;
height: 75vh;
}
#better-export-pdf .pdf-preview {
flex: auto;
position: relative;
display: flex;
flex-direction: column;
overflow-x: hidden;
overflow-y: scroll;
align-content: flex-start;
}
#better-export-pdf .pdf-preview .webview-wrapper {
position: relative;
height: 100%;
width: 100%;
}
#better-export-pdf .pdf-preview .print-size {
position: absolute;
right: 8px;
top: 8px;
z-index: 99;
font-size: 0.6rem;
white-space: pre-wrap;
text-align: right;
visibility: hidden;
}
#better-export-pdf .pdf-preview > div {
flex: 1;
height: 100%;
width: 100%;
}
#better-export-pdf .pdf-preview > div.progress {
flex: none;
height: auto;
width: 100%;
text-align: left;
}
#better-export-pdf .pdf-preview .filename {
font-size: 0.75rem;
color: var(--color-base-60);
}
#better-export-pdf .pdf-preview .filename:not(:first-child) {
padding-top: calc(var(--p-spacing));
}
#better-export-pdf webview {
flex: 1;
height: 100%;
width: 100%;
}
#better-export-pdf .setting-wrapper {
width: 320px;
margin-left: 16px;
}
#better-export-pdf .setting-wrapper .setting-item[hidden] {
display: none;
}

View File

@@ -12,11 +12,14 @@
"bash",
"Bash",
"Git",
"subshells"
"regex",
"subshells",
"trigger"
],
"syncDictionary": false,
"remoteDictionary": [],
"pickyMode": false,
"longCheckNotification": true,
"staticLanguage": "es-ES"
"staticLanguage": "es-ES",
"disabledRules": "AGREEMENT_POSTPONED_ADJ,WRONG_IMPERATIVE"
}

View 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"
}
}

14
.obsidian/snippets/pgbrk.css vendored Normal file
View File

@@ -0,0 +1,14 @@
/*Breaker de paginas.*/
/*Hace saltos de pagina despues de cada h1*/
@media print {
h1{
page-break-before: always;
}
h2, h3, h4, h5, h6 {
page-break-after: avoid;
}
.internal-embed{
page-break-after: avoid;
page-break-before: avoid;
}
}

7
.obsidian/themes/SALEM/manifest.json vendored Normal file
View 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
View 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;
}

View 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

File diff suppressed because one or more lines are too long

8
.obsidian/themes/W95/manifest.json vendored Normal file
View 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
View 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);
}

View File

@@ -4,41 +4,21 @@
"type": "split",
"children": [
{
"id": "ff8c33205872ddb4",
"id": "70040d3480c4df8e",
"type": "tabs",
"children": [
{
"id": "12abf23e5d2d15dd",
"id": "43ea8ee768c9bbae",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Documentación personal/Mecanica de Unix/1. Bash Scripting Avanzado/Funciones puras/Ejercicios/Ejercicios - Funciones puras.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",
"source": false
},
"icon": "lucide-file",
"title": "Ejercicios - Funciones puras"
}
}
]
},
{
"id": "e6733ee149dcba62",
"type": "tabs",
"children": [
{
"id": "cf699ca90183da60",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Documentación personal/Mecanica de Unix/1. Bash Scripting Avanzado/Funciones puras/Funciones puras.md",
"mode": "preview",
"source": false
},
"icon": "lucide-file",
"title": "Funciones puras"
"title": "LilCMS.JS - v0.0.1 - Notas de versión"
}
}
]
@@ -98,8 +78,7 @@
}
],
"direction": "horizontal",
"width": 317.5,
"collapsed": true
"width": 252.5
},
"right": {
"id": "519d5773673c1040",
@@ -108,6 +87,7 @@
{
"id": "ec141e7a66dc7ec8",
"type": "tabs",
"dimension": 54.131355932203384,
"children": [
{
"id": "5a14f2340b0f216e",
@@ -115,7 +95,7 @@
"state": {
"type": "backlink",
"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,
"extraContext": false,
"sortOrder": "alphabetical",
@@ -125,7 +105,7 @@
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "Enlaces entrantes de Funciones puras"
"title": "Enlaces entrantes de Apuntes generales de SQL"
}
},
{
@@ -157,21 +137,6 @@
"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",
"type": "leaf",
@@ -188,16 +153,16 @@
"state": {
"type": "outgoing-link",
"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,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
"title": "Enlaces salientes de Funciones puras"
"title": "Enlaces salientes de Apuntes generales de SQL"
}
},
{
"id": "ad0b933ded8362ff",
"id": "f680d743f846f5b9",
"type": "leaf",
"state": {
"type": "graph",
@@ -205,13 +170,29 @@
"icon": "lucide-git-fork",
"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",
"type": "tabs",
"dimension": 45.868644067796616,
"children": [
{
"id": "f3844ce27366e01c",
@@ -227,7 +208,7 @@
}
],
"direction": "horizontal",
"width": 285.5
"width": 242.5
},
"left-ribbon": {
"hiddenItems": {
@@ -241,44 +222,46 @@
"obsidian-git:Open Git source control": false
}
},
"active": "e615f9321ff830be",
"active": "43ea8ee768c9bbae",
"lastOpenFiles": [
"Documentación personal/Mecanica de Unix/1. Bash Scripting Avanzado/Funciones puras/Funciones puras.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",
"Documentación personal/Proyectos/LilCMS/JS_Version/Producción/v0.0.1/LilCMS.JS - v0.0.1 - Notas de versión.md",
"Documentación personal/Proyectos/LilCMS/JS_Version/Conceptos/LilCMS.JS - Concepto.md",
"Documentación personal/Proyectos/LilCMS/JS_Version/Producción/v0.0.1",
"Documentación personal/Proyectos/LilCMS/JS_Version/Producción",
"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/calculadora_modular.sh",
"Documentación personal/Mecanica de Unix/1. Bash Scripting Avanzado/Funciones puras/Ejercicios",
"Documentación personal/Mecanica de Unix/1. Bash Scripting Avanzado/Funciones puras",
"Documentación personal/Mecanica de Unix/Mecánica Unix - Manejo de la shell.md",
"Imagenes/SQL/Mezcla-cartesiana_(CROSS_JOIN).png",
"Imagenes/SQL",
"Imagenes",
"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",
"Sin título.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/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/Extra.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/Funciones puras/Funciones puras.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",
"Documentación personal/Mecanica de Unix",
"BDD/SQL/Diario/Clase 4 de diciembre.md",
"BDD/SQL/Lenguaje de Manupulación de Datos (DML).md",
"BDD/SQL/Lenguaje de definición de datos (DDL).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/desktop.ini",
"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/nessuslogo.png",
@@ -287,7 +270,6 @@
"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/pico_tpm_sniffer.webp",
"Documentación personal/Seguridad-Informatica/1_Imagenes/tools/hardware/omgcable.webp",
"Documentación personal/Seguridad-Informatica/1_Imagenes/tools/hardware/Flipper Zero.jpg"
"Documentación personal/Seguridad-Informatica/1_Imagenes/tools/hardware/omgcable.webp"
]
}

View 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)
[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.

View File

@@ -1,3 +1,5 @@
#SQL-ASIX - Structure Query Language
Proveniente de [[SQL]]
---
# Cosas explicadas:
@@ -19,7 +21,10 @@ ON DELETE RESTRICT;
- `CASCADE`:
```SQL
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)
ON DELETE CASCADE;
```

View File

@@ -1 +0,0 @@
En SQL, el Lenguaje de Manipulación de Datos (DML)

View File

@@ -1 +0,0 @@
En SQL, los Procedimientos almacenados

View File

@@ -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.
Todo lo que se incluye en SQL son:

View 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))

View File

@@ -0,0 +1,5 @@
#SQL-ASIX - Structure Query Language
Proveniente de [[SQL]]
---
En SQL, el Lenguaje de Manipulación de Datos (DML)

View File

@@ -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.
Exsten cuatro operaciones basicas: CREATE, ALTER, DROP y TRUNCATE.

View 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
```

View File

@@ -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

View File

@@ -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.
Algunos de los tipos de datos basicos de SQL son:
---
## Numeros enteros:
- **TINYINT(Tamaño)**: -128 a 127 normal. 0 a 255 sin signo. La cantidad maxima de digitos se puede especificar entre parentesis.
- **SMALLINT(Tamaño)**: -32768 a 32767 normal. 0 a 65535 sin signo. La cantidad maxima de digitos se pueden especificar entre parentesis.
- **MEDIUMINT(Tamaño)**: -8388608 a 8388607 normal. 0 a 16777215 sin signo. La cantidad maxima de digitos se pueden especificar entre parentesis.
- **INT(Tamaño)**: -2147483648 a 2147483647 normal. 0 a 4294967295 sin signo. La cantidad maxima de digitos se pueden especificar entre parentesis.
- **BIGINT(Tamaño)**: -9223372036854775808 a 9223372036854775807 normal. 0 a 18446744073709551615 sin signo. La cantidad maxima de digitos se pueden especificar entre parentesis.
- **TINYINT**: -128 a 127 normal. 0 a 255 sin signo.
- **SMALLINT**: -32768 a 32767 normal. 0 a 65535 sin signo.
- **MEDIUMINT**: -8388608 a 8388607 normal. 0 a 16777215 sin signo.
- **INT**: Da al valor el tipo INTEGER. Entero de 32 bits. Rango: -2147483648 a 2147483647 (signed)
- **BIGINT**: -9223372036854775808 a 9223372036854775807 normal. 0 a 18446744073709551615 sin signo.
---
## 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.
- **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
- **DATE ()**: Una fecha. Formato: AAAA-MM-DD.
- **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 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:
- **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
- **TEXTO**: Tiene una cadena con una longitud maxima de 65535 caracteres.
- **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.
>[!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 (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
>[!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:
- **bit** Entero que puede ser 0, 1 o NULL.
- **bit**: Tipo binario para almacenar Bits. No equivalente a BOOLEAN. Poco usado.

View File

@@ -1,3 +1,5 @@
#SQL-ASIX - Structure Query Language
Proveniente de [[SQL]]
---
# Importar bases de datos

View File

@@ -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
```

View File

@@ -6,7 +6,268 @@ Proveniente de [[Funciones puras]]
# 1. Calculadora modular
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 ))
}
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/)
- [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)
Bibliografia Web:
- [Manejo de errores en Bash Scripting](https://adictosalinux.com/manejo-errores-scripts-bash/)
# 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.

View File

@@ -1,44 +1,62 @@
#!/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 "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) $suma;;
2) $resta;;
3) $multiplicacion;;
4) $division;;
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"
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))
}

View File

@@ -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"

View File

@@ -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.
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).

View File

@@ -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.
# Lo que voy a apuntar va a ser:
#Temario-BSA - Bash Scripting Avanzado
Documento Padre
---
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
Aquí no se va a tratar solo de escribir scripts, sino de:
- [[Funciones puras]]
@@ -62,6 +65,12 @@ Aquí no se va a tratar solo de escribir scripts, sino de:
*Y esto aporta:*
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:
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.

View File

@@ -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);
```

View File

@@ -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.

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

View File

@@ -0,0 +1,4 @@
#LDM-CSS - CSS
Documento Padre
---

View File

@@ -0,0 +1,4 @@
#LDM-HTML - HTML
Documento Padre
---

View File

@@ -0,0 +1,6 @@
#LDM-JavaScript - Programación JavaScript
Documento Padre
---
### Documento Padre.

View File

@@ -0,0 +1,7 @@
#M9-PHP - Programación PHP
Documento Padre
---
### Documento padre de PHP
Documentos Hijos:

View File

@@ -0,0 +1,8 @@
#Python Programación Python
Documento Padre
---
### Documento padre de Python.
Documentos hijos:

View File

@@ -1,6 +1,6 @@
# 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
@@ -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.
(No me lo confundas con el juego. O sí, pero luego no digas que no furula).

View File

@@ -0,0 +1,200 @@
#M5-ASIX
## ASIX1A - M5 - Sebastian Ariel Duarte Oruez
### 10/12/25
Fet en Obsidian / Markdown
[Enunciat](https://aulavirtual.iesthosicodina.cat/moodle/pluginfile.php/275223/mod_assign/intro/Pt1.%20Instal·lació%20i%20avaluació%20daplicacions%20%282025-26%29.pdf)
# índex
```table-of-contents
```
# Entorn de desenvolupament de software (Linux)
A continuació, es detalla la selecció de software per a l'equip de desenvolupament, justificant les eleccions i comparant-les amb altres alternatives del mercat.
### 1. Entorn de Desenvolupament Integrat (IDE)
**Elecció:** **Visual Studio Code (VSCode)**
- **Justificació:** És actualment l'estàndard de facto a la indústria. És lleuger, de codi obert (en la seva base) i extremadament versàtil gràcies al seu ecosistema d'extensions. Permet unificar el desenvolupament de Javascript, PHP i Python en una sola interfície sense necessitat de canviar de programa.
- **Comparativa:**
- _VSCode vs Sublime Text:_ Sublime és més ràpid, però VSCode té millors eines de depuració (debugging) integrades i millor gestió de Git.
- _VSCode vs WebStorm/PyCharm (JetBrains):_ Les eines de JetBrains són més potents "out-of-the-box", però són de pagament i consumeixen molts més recursos del sistema. VSCode ofereix un equilibri perfecte entre rendiment i funcionalitat gratuïta.
### 2. Control de Versions (Git)
**Elecció:** **Git (Línia de comandes) + Extensió Git integrada a VSCode**
- **Justificació:** Git ve instal·lat per defecte o és trivial d'instal·lar en qualsevol distribució Linux. Tot i que la línia de comandes és essencial, per al dia a dia s'utilitzarà la **integració nativa de VSCode** (o extensions com _GitLens_), que permet veure diferències, fer commits i gestionar branques visualment sense sortir de l'editor.
- **Alternatives gràfiques:** GitKraken (molt visual però amb limitacions en versions gratuïtes) o SmartGit.
### 3. Tractament i Edició d'Imatges
**Elecció:** **GIMP (GNU Image Manipulation Program)**
- **Justificació:** És l'alternativa lliure més potent a Adobe Photoshop. Suporta capes, filtres avançats i scripts, cobrint totes les necessitats d'edició d'imatge per a web i desenvolupament.
- **Comparativa:**
- _GIMP vs Krita:_ Krita està més enfocat a la pintura digital i il·lustració. Per a retoc fotogràfic i manipulació general, GIMP és superior.
- _GIMP vs Inkscape:_ Inkscape és vectorial (SVG), mentre que GIMP és matricial. Per a edició de fotos, GIMP és l'eina correcta.
### 4. Tractament i Edició de Vídeo i Àudio
**Elecció:** **Kdenlive** (Vídeo) i **Audacity** (Àudio)
- **Justificació:**
- **Kdenlive:** És un editor de vídeo no lineal molt robust per a Linux, part del projecte KDE. Suporta múltiples pistes i formats sense necessitat de conversió prèvia.
- **Audacity:** És l'estàndard per a l'edició ràpida d'àudio, neteja de soroll i retall.
- **Comparativa:**
- _Kdenlive vs OpenShot:_ OpenShot és més senzill, però Kdenlive ofereix característiques més professionals necessàries si el projecte creix.
- _Audacity vs Ardour:_ Ardour és un DAW complet (com ProTools), massa complex per a tasques simples. Audacity és més àgil.
### 5. Accés a propietats d'arxius .PSD
**Elecció:** **GIMP** (o Photopea via web si es requereix especificitat)
- **Justificació:** Atès que ja hem instal·lat **GIMP**, aquest és capaç d'obrir i editar arxius natius de Photoshop (.psd). Manté les capes i permet veure propietats, ocultar elements i exportar assets.
- _Nota:_ Si es requereix una fidelitat del 100% sense instal·lar Photoshop (que no corre natiu a Linux), una alternativa online molt utilitzada és **Photopea**, però com a eina d'escriptori, GIMP compleix la funció.
### 6. Mockups i Prototipatge
**Elecció:** **Pencil Project** (pencil.evolus.vn)
- **Justificació:** És una eina de codi obert excel·lent per crear diagrames i prototips d'interfícies d'usuari (GUI) ràpides. Té col·leccions de formes per a Android, iOS i Web.
- **Comparativa:**
- _Pencil vs Balsamiq:_ Balsamiq és de pagament. Pencil és gratuït i ofereix una funcionalitat molt similar per a "wireframing".
- _Pencil vs Figma:_ Figma és l'estàndard actual però és basat en web (tot i que té client d'escriptori, consumeix molta RAM). Per a una eina 100% offline i lleugera, Pencil és ideal.
### 7. Navegadors Web (Testing)
**Elecció:** **Mozilla Firefox** (Principal), **Google Chrome** i **Chromium**
- **Justificació:**
- **Firefox:** Per les seves excel·lents eines de desenvolupament (DevTools) i privacitat.
- **Chrome/Chromium:** Necessari perquè és el motor (Blink) més utilitzat pels usuaris finals. És obligatori testejar que la web es vegi bé aquí.
### 8. Clients FTP Gràfics
**Elecció:** **FileZilla**
- **Justificació:** És el client FTP/SFTP més conegut, multiplataforma i robust. Permet gestió de llocs, cues de transferència i edició remota d'arxius.
- **Alternatives:** _gFTP_ (més antic) o _Cyberduck_ (CLI/Mac, menys comú a Linux GUI).
### 9. Clients SSH Gràfics
**Elecció:** **Termius** (o Remmina)
- **Justificació:** Tot i que a Linux se sol utilitzar la terminal nativa, **Termius** ofereix una interfície moderna per organitzar i guardar credencials de múltiples servidors, amb sincronització.
- _Alternativa clàssica:_ **Putty** (molt utilitzat a Windows, però existeix a Linux) o **Remmina**(que a més de SSH gestiona VNC i RDP, ideal per a administradors de sistemes). Recomanem **Remmina** per ser tot-en-un.
### 10. Comunicació en Temps Real
**Elecció:** **Slack**
- **Justificació:** És l'estàndard en moltes empreses de desenvolupament. Té client natiu per a Linux (.deb/.rpm/snap) que funciona fluidament.
- **Alternatives:** _Discord_ (més enfocat a gaming, tot i que utilitzat en dev) o _Mattermost_ (alternativa Open Source self-hosted).
### Instal·lació de la pila de desenvolupament (Backend/Frontend)
Per completar l'entorn, s'instal·laran els següents serveis sol·licitats:
1. **Servidor Web:** **Apache HTTP Server**. (Estàndard, robust i modular).
2. **Base de Dades Relacional:** **MariaDB**. (Fork de MySQL totalment compatible, open source i amb millor rendiment/comunitat a Linux).
3. **Javascript Runtime:** **Node.js** (Versió LTS per a estabilitat).
4. **Base de Dades NoSQL:** **MongoDB**.
5. **Gestors de BBDD Gràfics:**
- **DBeaver** o **Adminer**: L'enunciat demana _Adminer_ (que és un script PHP), però **DBeaver** és una aplicació d'escriptori universal molt més potent per a desenvolupadors. Si cal cenyir-se a l'enunciat: **Adminer**.
- **MongoDB Compass**: L'eina oficial GUI per a MongoDB.
6. **API Testing:** **Postman**. Imprescindible per provar els endpoints del desenvolupament Backend.
# Entorn Windows (Ofimàtica)
Seguint els criteris d'eficiència i estandardització per al departament administratiu/ofimàtica.
### 1. Suite Ofimàtica
**Elecció:** **LibreOffice** (Opció Open Source) o **Microsoft Office 365** (Estàndard empresarial).
- _Recomanació:_ Si l'empresa busca estalviar costos i utilitzar software lliure com al departament de desenvolupament: **LibreOffice**. Si es requereix màxima compatibilitat amb clients externs: **Microsoft Office**.
- **Justificació LibreOffice:** Inclou Writer (Docs), Calc (Excel) i Impress (PowerPoint). És gratuït i llegeix formats de Microsoft.
### 2. Infografies i Presentacions
**Elecció:** **Canva** (Online - Accés directe) i **Impress/PowerPoint** (Escriptori).
- **Justificació:**
- **Canva:** Per a infografies ràpides i modernes, és insuperable en facilitat d'ús. En ser online, crearem un accés directe a l'escriptori o marcador al navegador.
- **Eina d'escriptori:** Per a presentacions confidencials o sense internet, s'utilitzarà la inclosa a la suite ofimàtica.
### 3. Videoconferència
**Elecció:** **Microsoft Teams** (o Zoom).
- **Justificació:**
- **Teams:** Si l'empresa utilitza entorn Windows, Teams sol venir integrat i permet xat + vídeo + gestió d'arxius.
- **Zoom:** És l'alternativa més estable si només es busca vídeo i no col·laboració documental.
### 4. Comunicació Interna
**Elecció:** **Slack** (Versió Windows).
- **Justificació:** Per mantenir la coherència amb el departament de desenvolupament i que tota l'empresa estigui al mateix canal de comunicació.
### 5. Utilitats Vàries (Necessàries per a l'entorn)
- **Compressor:** **7-Zip** (Gratuït, potent, obre tot).
- **Lector PDF:** **Adobe Acrobat Reader** o **Foxit Reader** (Per signar documents i visualització avançada).
- **Navegador:** **Google Chrome** o **Edge** (Preinstal·lat, funciona bé en entorn corporatiu).
- **Reproductor Multimèdia:** **VLC Media Player** (Per obrir qualsevol vídeo o àudio sense problemes de còdecs).

View File

@@ -0,0 +1,10 @@
#M5-ASIX - Montaje de servidores
Documento Padre
---
[^1]: Documentos hijos:
- [[M5RA2P1]]