Ahora si limpie bien :c

This commit is contained in:
2020-11-22 21:17:17 -03:00
parent 199a1e2a61
commit f44970cffa
20 changed files with 0 additions and 1281 deletions

View File

@@ -1,43 +0,0 @@
<!DOCTYPE html>
<html lang="es">
<head>
<title>Daniel Cortés</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width-device-width, initial-scale=1">
<meta name="author" content="Daniel Cortés">
<link rel="stylesheet" href="/assets/style.css" type="text/css">
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>
<div class="container">
<h1>About</h1>
<p>Hola!, soy un estudiante de ingeniería en informática al que le gusta programar,
jugar videojuegos cuando se puede y escuchar música, mucha, mucha música.</p>
<p>Me gusta aprender nuevos lenguajes de programación pero generalmente estoy seco
de ideas con lo que me cuesta bastante avanzar en lenguajes como C y C++, en los
que simplemente no se hacer.</p>
<p>Este blog lo cree principalmente porque quería un proyecto secundario en el que
trabajar, que no tuviera tanta importancia y lo hiciera de relax, la idea es
publicar snipets de código que generalmente se me olvidan y siempre estoy
volviendo a ellos, si en algún momento me emociono quizás publico algo
totalmente distinto.</p>
<p>Para ver los proyectos que he hecho puedes verlos en <a href="https://gitlab.com/Ryuuji159">Gitlab</a></p>
<p>Socialmente me muevo entre <a href="https://twitter.com/skrd159">Twitter</a> y
<a href="https://www.reddit.com/user/Ryuuji159">Reddit</a> aunque estoy intentando dejar
las redes sociales como ya lo hice con Facebook.</p>
<p>Finalmente, si quieres enviarme un correo mi dirección es daniel.cortes.p159@gmail.com</p>
<p><em>Gracias por venir aquí.</em></p>
</div>
<script>
function makeImagesClickeable() {
document.querySelectorAll("img").forEach(img => {
img.addEventListener("click", e => window.open(e.target.src))
});
}
window.addEventListener('load', (event) => {
makeImagesClickeable();
});
</script>
</body>
</html>

View File

@@ -1,643 +0,0 @@
.codehilite .hll { background-color: #f1fa8c }
.codehilite { background: #282a36; color: #f8f8f2 }
.codehilite .c { color: #6272a4 } /* Comment */
.codehilite .err { color: #f8f8f2 } /* Error */
.codehilite .g { color: #f8f8f2 } /* Generic */
.codehilite .k { color: #ff79c6 } /* Keyword */
.codehilite .l { color: #f8f8f2 } /* Literal */
.codehilite .n { color: #f8f8f2 } /* Name */
.codehilite .o { color: #ff79c6 } /* Operator */
.codehilite .x { color: #f8f8f2 } /* Other */
.codehilite .p { color: #f8f8f2 } /* Punctuation */
.codehilite .ch { color: #6272a4 } /* Comment.Hashbang */
.codehilite .cm { color: #6272a4 } /* Comment.Multiline */
.codehilite .cp { color: #ff79c6 } /* Comment.Preproc */
.codehilite .cpf { color: #6272a4 } /* Comment.PreprocFile */
.codehilite .c1 { color: #6272a4 } /* Comment.Single */
.codehilite .cs { color: #6272a4 } /* Comment.Special */
.codehilite .gd { color: #8b080b } /* Generic.Deleted */
.codehilite .ge { color: #f8f8f2; text-decoration: underline } /* Generic.Emph */
.codehilite .gr { color: #f8f8f2 } /* Generic.Error */
.codehilite .gh { color: #f8f8f2; font-weight: bold } /* Generic.Heading */
.codehilite .gi { color: #f8f8f2; font-weight: bold } /* Generic.Inserted */
.codehilite .go { color: #44475a } /* Generic.Output */
.codehilite .gp { color: #f8f8f2 } /* Generic.Prompt */
.codehilite .gs { color: #f8f8f2 } /* Generic.Strong */
.codehilite .gu { color: #f8f8f2; font-weight: bold } /* Generic.Subheading */
.codehilite .gt { color: #f8f8f2 } /* Generic.Traceback */
.codehilite .kc { color: #ff79c6 } /* Keyword.Constant */
.codehilite .kd { color: #8be9fd; font-style: italic } /* Keyword.Declaration */
.codehilite .kn { color: #ff79c6 } /* Keyword.Namespace */
.codehilite .kp { color: #ff79c6 } /* Keyword.Pseudo */
.codehilite .kr { color: #ff79c6 } /* Keyword.Reserved */
.codehilite .kt { color: #8be9fd } /* Keyword.Type */
.codehilite .ld { color: #f8f8f2 } /* Literal.Date */
.codehilite .m { color: #bd93f9 } /* Literal.Number */
.codehilite .s { color: #f1fa8c } /* Literal.String */
.codehilite .na { color: #50fa7b } /* Name.Attribute */
.codehilite .nb { color: #8be9fd; font-style: italic } /* Name.Builtin */
.codehilite .nc { color: #50fa7b } /* Name.Class */
.codehilite .no { color: #f8f8f2 } /* Name.Constant */
.codehilite .nd { color: #f8f8f2 } /* Name.Decorator */
.codehilite .ni { color: #f8f8f2 } /* Name.Entity */
.codehilite .ne { color: #f8f8f2 } /* Name.Exception */
.codehilite .nf { color: #50fa7b } /* Name.Function */
.codehilite .nl { color: #8be9fd; font-style: italic } /* Name.Label */
.codehilite .nn { color: #f8f8f2 } /* Name.Namespace */
.codehilite .nx { color: #f8f8f2 } /* Name.Other */
.codehilite .py { color: #f8f8f2 } /* Name.Property */
.codehilite .nt { color: #ff79c6 } /* Name.Tag */
.codehilite .nv { color: #8be9fd; font-style: italic } /* Name.Variable */
.codehilite .ow { color: #ff79c6 } /* Operator.Word */
.codehilite .w { color: #f8f8f2 } /* Text.Whitespace */
.codehilite .mb { color: #bd93f9 } /* Literal.Number.Bin */
.codehilite .mf { color: #bd93f9 } /* Literal.Number.Float */
.codehilite .mh { color: #bd93f9 } /* Literal.Number.Hex */
.codehilite .mi { color: #bd93f9 } /* Literal.Number.Integer */
.codehilite .mo { color: #bd93f9 } /* Literal.Number.Oct */
.codehilite .sa { color: #f1fa8c } /* Literal.String.Affix */
.codehilite .sb { color: #f1fa8c } /* Literal.String.Backtick */
.codehilite .sc { color: #f1fa8c } /* Literal.String.Char */
.codehilite .dl { color: #f1fa8c } /* Literal.String.Delimiter */
.codehilite .sd { color: #f1fa8c } /* Literal.String.Doc */
.codehilite .s2 { color: #f1fa8c } /* Literal.String.Double */
.codehilite .se { color: #f1fa8c } /* Literal.String.Escape */
.codehilite .sh { color: #f1fa8c } /* Literal.String.Heredoc */
.codehilite .si { color: #f1fa8c } /* Literal.String.Interpol */
.codehilite .sx { color: #f1fa8c } /* Literal.String.Other */
.codehilite .sr { color: #f1fa8c } /* Literal.String.Regex */
.codehilite .s1 { color: #f1fa8c } /* Literal.String.Single */
.codehilite .ss { color: #f1fa8c } /* Literal.String.Symbol */
.codehilite .bp { color: #f8f8f2; font-style: italic } /* Name.Builtin.Pseudo */
.codehilite .fm { color: #50fa7b } /* Name.Function.Magic */
.codehilite .vc { color: #8be9fd; font-style: italic } /* Name.Variable.Class */
.codehilite .vg { color: #8be9fd; font-style: italic } /* Name.Variable.Global */
.codehilite .vi { color: #8be9fd; font-style: italic } /* Name.Variable.Instance */
.codehilite .vm { color: #8be9fd; font-style: italic } /* Name.Variable.Magic */
.codehilite .il { color: #bd93f9 } /* Literal.Number.Integer.Long */
:root{
--background-color: hsl(10, 20%, 98%);
--foreground-color: hsl(10, 10%, 13%);
--primary-color: hsl(200, 90%, 40%);
--highlight-color: hsl(290, 86%, 43%);
--light-color: hsl(10, 10%, 40%);
}
body {
background-color: var(--background-color);
color: var(--foreground-color);
overflow-y: scroll;
font-family: 'Source Sans Pro', sans-serif;
font-size: 1.5em;
}
@media only screen and (max-width: 800px) {
body {
font-size: 1em;
}
}
.container {
max-width: 80ch;
padding: 2ch;
padding-bottom: 5em;
margin: auto;
}
h1 {
margin: 1em 0;
}
time {
color: var(--light-color);
}
p {
line-height: 1.5em;
text-align: justify;
}
a, a:visited {
color: var(--highlight-color);
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
img {
max-width: 100%;
cursor: pointer;
}
code {
font-size: 1.2em;
}
.codehilite {
font-family: 'Source Code Pro', monospace;
font-size: 1.2em;
border: none;
border-radius: 5px;
overflow-x: auto;
}
.codehilite pre {
margin: 1em;
}
/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */
/* Document
========================================================================== */
/**
* 1. Correct the line height in all browsers.
* 2. Prevent adjustments of font size after orientation changes in iOS.
*/
html {
line-height: 1.15; /* 1 */
-webkit-text-size-adjust: 100%; /* 2 */
}
/* Sections
========================================================================== */
/**
* Remove the margin in all browsers.
*/
body {
margin: 0;
}
/**
* Render the `main` element consistently in IE.
*/
main {
display: block;
}
/**
* Correct the font size and margin on `h1` elements within `section` and
* `article` contexts in Chrome, Firefox, and Safari.
*/
h1 {
font-size: 2em;
margin: 0.67em 0;
}
/* Grouping content
========================================================================== */
/**
* 1. Add the correct box sizing in Firefox.
* 2. Show the overflow in Edge and IE.
*/
hr {
box-sizing: content-box; /* 1 */
height: 0; /* 1 */
overflow: visible; /* 2 */
}
/**
* 1. Correct the inheritance and scaling of font size in all browsers.
* 2. Correct the odd `em` font sizing in all browsers.
*/
pre {
font-family: monospace, monospace; /* 1 */
font-size: 1em; /* 2 */
}
/* Text-level semantics
========================================================================== */
/**
* Remove the gray background on active links in IE 10.
*/
a {
background-color: transparent;
}
/**
* 1. Remove the bottom border in Chrome 57-
* 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
*/
abbr[title] {
border-bottom: none; /* 1 */
text-decoration: underline; /* 2 */
text-decoration: underline dotted; /* 2 */
}
/**
* Add the correct font weight in Chrome, Edge, and Safari.
*/
b,
strong {
font-weight: bolder;
}
/**
* 1. Correct the inheritance and scaling of font size in all browsers.
* 2. Correct the odd `em` font sizing in all browsers.
*/
code,
kbd,
samp {
font-family: monospace, monospace; /* 1 */
font-size: 1em; /* 2 */
}
/**
* Add the correct font size in all browsers.
*/
small {
font-size: 80%;
}
/**
* Prevent `sub` and `sup` elements from affecting the line height in
* all browsers.
*/
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
/* Embedded content
========================================================================== */
/**
* Remove the border on images inside links in IE 10.
*/
img {
border-style: none;
}
/* Forms
========================================================================== */
/**
* 1. Change the font styles in all browsers.
* 2. Remove the margin in Firefox and Safari.
*/
button,
input,
optgroup,
select,
textarea {
font-family: inherit; /* 1 */
font-size: 100%; /* 1 */
line-height: 1.15; /* 1 */
margin: 0; /* 2 */
}
/**
* Show the overflow in IE.
* 1. Show the overflow in Edge.
*/
button,
input { /* 1 */
overflow: visible;
}
/**
* Remove the inheritance of text transform in Edge, Firefox, and IE.
* 1. Remove the inheritance of text transform in Firefox.
*/
button,
select { /* 1 */
text-transform: none;
}
/**
* Correct the inability to style clickable types in iOS and Safari.
*/
button,
[type="button"],
[type="reset"],
[type="submit"] {
-webkit-appearance: button;
}
/**
* Remove the inner border and padding in Firefox.
*/
button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner,
[type="submit"]::-moz-focus-inner {
border-style: none;
padding: 0;
}
/**
* Restore the focus styles unset by the previous rule.
*/
button:-moz-focusring,
[type="button"]:-moz-focusring,
[type="reset"]:-moz-focusring,
[type="submit"]:-moz-focusring {
outline: 1px dotted ButtonText;
}
/**
* Correct the padding in Firefox.
*/
fieldset {
padding: 0.35em 0.75em 0.625em;
}
/**
* 1. Correct the text wrapping in Edge and IE.
* 2. Correct the color inheritance from `fieldset` elements in IE.
* 3. Remove the padding so developers are not caught out when they zero out
* `fieldset` elements in all browsers.
*/
legend {
box-sizing: border-box; /* 1 */
color: inherit; /* 2 */
display: table; /* 1 */
max-width: 100%; /* 1 */
padding: 0; /* 3 */
white-space: normal; /* 1 */
}
/**
* Add the correct vertical alignment in Chrome, Firefox, and Opera.
*/
progress {
vertical-align: baseline;
}
/**
* Remove the default vertical scrollbar in IE 10+.
*/
textarea {
overflow: auto;
}
/**
* 1. Add the correct box sizing in IE 10.
* 2. Remove the padding in IE 10.
*/
[type="checkbox"],
[type="radio"] {
box-sizing: border-box; /* 1 */
padding: 0; /* 2 */
}
/**
* Correct the cursor style of increment and decrement buttons in Chrome.
*/
[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
height: auto;
}
/**
* 1. Correct the odd appearance in Chrome and Safari.
* 2. Correct the outline style in Safari.
*/
[type="search"] {
-webkit-appearance: textfield; /* 1 */
outline-offset: -2px; /* 2 */
}
/**
* Remove the inner padding in Chrome and Safari on macOS.
*/
[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
/**
* 1. Correct the inability to style clickable types in iOS and Safari.
* 2. Change font properties to `inherit` in Safari.
*/
::-webkit-file-upload-button {
-webkit-appearance: button; /* 1 */
font: inherit; /* 2 */
}
/* Interactive
========================================================================== */
/*
* Add the correct display in Edge, IE 10+, and Firefox.
*/
details {
display: block;
}
/*
* Add the correct display in all browsers.
*/
summary {
display: list-item;
}
/* Misc
========================================================================== */
/**
* Add the correct display in IE 10+.
*/
template {
display: none;
}
/**
* Add the correct display in IE 10.
*/
[hidden] {
display: none;
}
/******************************************************************************
=> Fonts
*******************************************************************************/
/******************************************************************************
=> Source Code Pro
*******************************************************************************/
@font-face {
font-family: 'Source Code Pro';
font-style: normal;
font-weight: 400;
src: local('Source Code Pro'), url('https://static.danielcortes.xyz/fonts/SourceCodePro/SourceCodePro-Regular.ttf') format('truetype');
}
@font-face {
font-family: 'Source Code Pro';
font-style: normal;
font-weight: 700;
src: local('Source Code Pro'), url('https://static.danielcortes.xyz/fonts/SourceCodePro/SourceCodePro-Bold.ttf') format('truetype');
}
/******************************************************************************
=> Source Serif Pro
*******************************************************************************/
@font-face {
font-family: 'Source Serif Pro';
font-style: normal;
font-weight: 400;
src: local('Source Serif Pro'), url('https://static.danielcortes.xyz/fonts/SourceSerifPro/SourceSerifPro-Regular.ttf') format('truetype');
}
@font-face {
font-family: 'Source Serif Pro';
font-style: normal;
font-weight: 700;
src: local('Source Serif Pro'), url('https://static.danielcortes.xyz/fonts/SourceSerifPro/SourceSerifPro-Bold.ttf') format('truetype');
}
/******************************************************************************
=> Source Sans Pro
*******************************************************************************/
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 400;
src: local('Source Sans Pro'), url('https://static.danielcortes.xyz/fonts/SourceSansPro/SourceSansPro-Regular.ttf') format('truetype');
}
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 700;
src: local('Source Sans Pro'), url('https://static.danielcortes.xyz/fonts/SourceSansPro/SourceSansPro-Bold.ttf') format('truetype');
}
/******************************************************************************
=> CODEHILITE
*******************************************************************************/
.codehilite .hll{background-color:#f1fa8c}.codehilite{background:#282a36;color:#f8f8f2}.codehilite .c{color:#6272a4}.codehilite .err,.codehilite .g{color:#f8f8f2}.codehilite .k{color:#ff79c6}.codehilite .l,.codehilite .n{color:#f8f8f2}.codehilite .o{color:#ff79c6}.codehilite .p,.codehilite .x{color:#f8f8f2}.codehilite .ch,.codehilite .cm{color:#6272a4}.codehilite .cp{color:#ff79c6}.codehilite .c1,.codehilite .cpf,.codehilite .cs{color:#6272a4}.codehilite .gd{color:#8b080b}.codehilite .ge{color:#f8f8f2;text-decoration:underline}.codehilite .gr{color:#f8f8f2}.codehilite .gh,.codehilite .gi{color:#f8f8f2;font-weight:700}.codehilite .go{color:#44475a}.codehilite .gp,.codehilite .gs,.codehilite .gt{color:#f8f8f2}.codehilite .gu{color:#f8f8f2;font-weight:700}.codehilite .kc{color:#ff79c6}.codehilite .kd{color:#8be9fd;font-style:italic}.codehilite .kn,.codehilite .kp,.codehilite .kr{color:#ff79c6}.codehilite .kt{color:#8be9fd}.codehilite .ld{color:#f8f8f2}.codehilite .m{color:#bd93f9}.codehilite .s{color:#f1fa8c}.codehilite .na{color:#50fa7b}.codehilite .nb{color:#8be9fd;font-style:italic}.codehilite .nc{color:#50fa7b}.codehilite .nd,.codehilite .ne,.codehilite .ni,.codehilite .no{color:#f8f8f2}.codehilite .nf{color:#50fa7b}.codehilite .nl{color:#8be9fd;font-style:italic}.codehilite .nn,.codehilite .nx,.codehilite .py{color:#f8f8f2}.codehilite .nt{color:#ff79c6}.codehilite .nv{color:#8be9fd;font-style:italic}.codehilite .ow{color:#ff79c6}.codehilite .w{color:#f8f8f2}.codehilite .mb,.codehilite .mf,.codehilite .mh,.codehilite .mi,.codehilite .mo{color:#bd93f9}.codehilite .dl,.codehilite .s1,.codehilite .s2,.codehilite .sa,.codehilite .sb,.codehilite .sc,.codehilite .sd,.codehilite .se,.codehilite .sh,.codehilite .si,.codehilite .sr,.codehilite .ss,.codehilite .sx{color:#f1fa8c}.codehilite .bp{color:#f8f8f2;font-style:italic}.codehilite .fm{color:#50fa7b}.codehilite .vc,.codehilite .vg,.codehilite .vi,.codehilite .vm{color:#8be9fd;font-style:italic}.codehilite .il{color:#bd93f9}
/******************************************************************************
=> MAIN STYLES
*******************************************************************************/
:root{
--background-color: hsl(10, 20%, 98%);
--foreground-color: hsl(10, 10%, 13%);
--primary-color: hsl(200, 90%, 40%);
--highlight-color: hsl(290, 86%, 43%);
--light-color: hsl(10, 10%, 40%);
}
body {
background-color: var(--background-color);
color: var(--foreground-color);
overflow-y: scroll;
font-family: Source Sans Pro;
font-size: 1em;
}
@media only screen and (max-width: 800px) {
body {
font-size: 1em;
}
}
.container {
max-width: 80ch;
padding: 2em 0;
margin: auto;
}
h1 {
margin: 0;
}
time {
color: var(--light-color);
}
p {
line-height: 1.5em;
text-align: justify;
}
a, a:visited {
color: var(--highlight-color);
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
img {
max-width: 100%;
cursor: pointer;
}
code {
font-family: Source Code Pro;
font-size: 1em;
}
.codehilite {
border: none;
border-radius: 5px;
overflow-x: auto;
}
.codehilite pre {
margin: 1em;
}
/******************************************************************************
=> NORMALIZE.CSS
*******************************************************************************/
button,hr,input{overflow:visible}progress,sub,sup{vertical-align:baseline}[type=checkbox],[type=radio],legend{box-sizing:border-box;padding:0}html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}details,main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:ButtonText dotted 1px}fieldset{padding:.35em .75em .625em}legend{color:inherit;display:table;max-width:100%;white-space:normal}textarea{overflow:auto}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}[hidden],template{display:none}
/******************************************************************************
=> FONTS
*******************************************************************************/
@font-face{font-family:'Source Code Pro';font-style:normal;font-weight:400;src:local('Source Code Pro'),url(https://static.danielcortes.xyz/fonts/SourceCodePro/SourceCodePro-Regular.woff2) format('woff2');font-display:swap}
@font-face{font-family:'Source Code Pro';font-style:normal;font-weight:700;src:local('Source Code Pro'),url(https://static.danielcortes.xyz/fonts/SourceCodePro/SourceCodePro-Bold.woff2) format('woff2');font-display:swap}
@font-face{font-family:'Source Serif Pro';font-style:normal;font-weight:400;src:local('Source Serif Pro'),url(https://static.danielcortes.xyz/fonts/SourceSerifPro/SourceSerifPro-Regular.woff2) format('woff2')}
@font-face{font-family:'Source Serif Pro';font-style:normal;font-weight:700;src:local('Source Serif Pro'),url(https://static.danielcortes.xyz/fonts/SourceSerifPro/SourceSerifPro-Bold.woff2) format('woff2');font-display:swap}
@font-face{font-family:'Source Sans Pro';font-style:normal;font-weight:400;src:local('Source Sans Pro'),url(https://static.danielcortes.xyz/fonts/SourceSansPro/SourceSansPro-Regular.woff2) format('woff2');font-display:swap}
@font-face{font-family:'Source Sans Pro';font-style:normal;font-weight:700;src:local('Source Sans Pro'),url(https://static.danielcortes.xyz/fonts/SourceSansPro/SourceSansPro-Bold.woff2) format('woff2');font-display:swap}

View File

@@ -1,109 +0,0 @@
<!DOCTYPE html>
<html lang="es">
<head>
<title>Daniel Cortés</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width-device-width, initial-scale=1">
<meta name="author" content="Daniel Cortés">
<link rel="stylesheet" href="/assets/style.css" type="text/css">
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>
<div class="container">
<h1>Una mejor forma para contar utilizando HashMaps en Java</h1>
<p><time datetime="2019-10-17"> Oct 17, 2019 </time></p>
<p>Este es un problema muy común y se presenta regularmente en multiples
situaciones, tienes una lista de cosas que se repiten y tienes que contar sus
ocurrencias, o tal vez necesitas contar los largos de una lista de palabras,
etc (ahora no se me ocurren mas).</p>
<p>Previo a Java 8, la única forma (que a mi se me ocurra al menos) de hacer esto
era así: </p>
<div class="codehilite"><pre><span></span><code><span class="n">String</span><span class="o">[]</span> <span class="n">things</span> <span class="o">=</span> <span class="p">{</span>
<span class="s">&quot;ball&quot;</span><span class="p">,</span> <span class="s">&quot;celery&quot;</span><span class="p">,</span> <span class="s">&quot;hand&quot;</span><span class="p">,</span> <span class="s">&quot;celery&quot;</span><span class="p">,</span>
<span class="s">&quot;mind&quot;</span><span class="p">,</span> <span class="s">&quot;ball&quot;</span><span class="p">,</span> <span class="s">&quot;fresh&quot;</span><span class="p">,</span> <span class="s">&quot;hand&quot;</span><span class="p">,</span> <span class="s">&quot;ball&quot;</span><span class="p">,</span>
<span class="s">&quot;fresh&quot;</span><span class="p">,</span> <span class="s">&quot;fresh&quot;</span>
<span class="p">};</span>
<span class="n">Map</span><span class="o">&lt;</span><span class="n">String</span><span class="p">,</span> <span class="n">Integer</span><span class="o">&gt;</span> <span class="n">oldWay</span> <span class="o">=</span> <span class="k">new</span> <span class="n">HashMap</span><span class="o">&lt;&gt;</span><span class="p">();</span>
<span class="k">for</span> <span class="p">(</span><span class="n">String</span> <span class="n">thing</span> <span class="p">:</span> <span class="n">things</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="n">oldWay</span><span class="p">.</span><span class="na">containsKey</span><span class="p">(</span><span class="n">thing</span><span class="p">))</span> <span class="p">{</span>
<span class="n">oldWay</span><span class="p">.</span><span class="na">put</span><span class="p">(</span><span class="n">thing</span><span class="p">,</span> <span class="n">oldWay</span><span class="p">.</span><span class="na">get</span><span class="p">(</span><span class="n">thing</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="n">oldWay</span><span class="p">.</span><span class="na">put</span><span class="p">(</span><span class="n">thing</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&quot;ball =&gt; &quot;</span> <span class="o">+</span> <span class="n">oldWay</span><span class="p">.</span><span class="na">get</span><span class="p">(</span><span class="s">&quot;ball&quot;</span><span class="p">));</span>
<span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&quot;celery =&gt; &quot;</span> <span class="o">+</span> <span class="n">oldWay</span><span class="p">.</span><span class="na">get</span><span class="p">(</span><span class="s">&quot;celery&quot;</span><span class="p">));</span>
<span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&quot;hand =&gt; &quot;</span> <span class="o">+</span> <span class="n">oldWay</span><span class="p">.</span><span class="na">get</span><span class="p">(</span><span class="s">&quot;hand&quot;</span><span class="p">));</span>
<span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&quot;fresh =&gt; &quot;</span> <span class="o">+</span> <span class="n">oldWay</span><span class="p">.</span><span class="na">get</span><span class="p">(</span><span class="s">&quot;fresh&quot;</span><span class="p">));</span>
<span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&quot;mind =&gt; &quot;</span> <span class="o">+</span> <span class="n">oldWay</span><span class="p">.</span><span class="na">get</span><span class="p">(</span><span class="s">&quot;mind&quot;</span><span class="p">));</span>
</code></pre></div>
<p>Lo cual resulta en:</p>
<div class="codehilite"><pre><span></span><code>ball =&gt; 3
celery =&gt; 2
hand =&gt; 2
fresh =&gt; 3
mind =&gt; 1
</code></pre></div>
<p>Este es el código que utilizaba siempre cuando estaba aprendiendo Java, pero
es realmente confuso cuando estas empezando, al menos yo tuve muchos problemas
con nulls porque no entendía realmente que estaba haciendo. </p>
<p>Primero tenemos que comprobar si el elemento existe, si existe debemos
obtenerlo para sumarlo y agregarlo al <code>HashMap</code>, y cuando no existe, se coloca
la key con el valor por default, en este caso 1.</p>
<p>Pero este código puede ser mas corto y claro desde la llegada de Java 8 y
actualmente estamos en Java 13 así que no hay escusa, ahora tenemos Lambdas y
<code>HashMap</code> recibió nuevas funciones, entre ellas las que se usaran aquí,
<code>putIfAbsent()</code> y <code>computeIfPresent()</code>: </p>
<div class="codehilite"><pre><span></span><code><span class="k">for</span> <span class="p">(</span><span class="n">String</span> <span class="n">thing</span> <span class="p">:</span> <span class="n">things</span><span class="p">)</span> <span class="p">{</span>
<span class="n">eightWay</span><span class="p">.</span><span class="na">putIfAbsent</span><span class="p">(</span><span class="n">thing</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
<span class="n">eightWay</span><span class="p">.</span><span class="na">computeIfPresent</span><span class="p">(</span><span class="n">thing</span><span class="p">,</span> <span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">value</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div>
<p><code>pufIfAbsent()</code> agrega una key solamente si no existe previamente y
<code>computeIfPresent()</code> calcula el nuevo valor que contendrá la key con el
lambda que se entrega en el segundo argumento, como los 2 serán ejecutados si
es que el elemento no existe en el <code>HashMap</code>, se empieza a contar desde 0.</p>
<p>Pero tenemos una función que es mas concisa y al menos a mi me agrada mas para
solucionar este problema, esta se llama <code>merge()</code>:</p>
<div class="codehilite"><pre><span></span><code><span class="k">for</span> <span class="p">(</span><span class="n">String</span> <span class="n">thing</span> <span class="p">:</span> <span class="n">things</span><span class="p">)</span> <span class="p">{</span>
<span class="n">betterWay</span><span class="p">.</span><span class="na">merge</span><span class="p">(</span><span class="n">thing</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="n">oldValue</span><span class="p">,</span> <span class="n">newValue</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">oldValue</span> <span class="o">+</span> <span class="n">newValue</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div>
<p><code>merge()</code> toma por argumentos, la key que se agregara, el valor que se quiere
agregar y un lambda que ejecutar si es ya existía la key, en el se podrá
calcular el nuevo valor que en este caso suma el valor antiguo con el valor
que se quiere agregar.</p>
<p>Incluso esta forma puede quedar aun mas corta si se utiliza una referencia de
método, en ingles: method reference, que suena bastante mejor a mi gusto:</p>
<div class="codehilite"><pre><span></span><code><span class="k">for</span> <span class="p">(</span><span class="n">String</span> <span class="n">thing</span> <span class="p">:</span> <span class="n">things</span><span class="p">)</span> <span class="p">{</span>
<span class="n">evenBetterWay</span><span class="p">.</span><span class="na">merge</span><span class="p">(</span><span class="n">thing</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">Integer</span><span class="p">::</span><span class="n">sum</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div>
<p>Y esa seria una mejor forma de contar con <code>HashMaps</code>, no es que sea
necesariamente mas rápido, de hecho ni siquiera he testeado su velocidad, pero
el código queda mucho mas corto y claro, ademas, siempre se me olvida como se
hace, así que ahora quedara escrito aquí para que mi futuro yo lo pueda
recordar.</p>
</div>
<script>
function makeImagesClickeable() {
document.querySelectorAll("img").forEach(img => {
img.addEventListener("click", e => window.open(e.target.src))
});
}
window.addEventListener('load', (event) => {
makeImagesClickeable();
});
</script>
</body>
</html>

View File

@@ -1,32 +0,0 @@
<!DOCTYPE html>
<html lang="es">
<head>
<title>Daniel Cortés</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width-device-width, initial-scale=1">
<meta name="author" content="Daniel Cortés">
<link rel="stylesheet" href="/assets/style.css" type="text/css">
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>
<div class="container">
<h1>Blog</h1>
<ul>
<li><a href="/blog/olvido_sobre_sql.html">Cosas que olvido sobre SQL</a></li>
<li><a href="/blog/olvido_sobre_git.html">Comandos de git que olvido constantemente</a></li>
<li><a href="/blog/contar_con_hashmaps_java.html">Una mejor forma para contar utilizando HashMaps en Java</a></li>
</ul>
</div>
<script>
function makeImagesClickeable() {
document.querySelectorAll("img").forEach(img => {
img.addEventListener("click", e => window.open(e.target.src))
});
}
window.addEventListener('load', (event) => {
makeImagesClickeable();
});
</script>
</body>
</html>

View File

@@ -1,58 +0,0 @@
<!DOCTYPE html>
<html lang="es">
<head>
<title>Daniel Cortés</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width-device-width, initial-scale=1">
<meta name="author" content="Daniel Cortés">
<link rel="stylesheet" href="/assets/style.css" type="text/css">
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>
<div class="container">
<h1>Comandos de git que olvido constantemente</h1>
<p><time datetime="2019-10-23">Oct 23, 2019</time></p>
<p>Aquí ire dejando multiples comandos de git que he estado buscando muchas veces y siempre vuelvo a olvidar</p>
<h3>1 - Sacar archivo o carpeta de la zona de stage</h3>
<div class="codehilite"><pre><span></span><code>git reset HEAD -- &lt;archivo/carpeta&gt;
</code></pre></div>
<h3>2 - Deshacer ultimo commit</h3>
<div class="codehilite"><pre><span></span><code>git reset --soft HEAD~1
</code></pre></div>
<h3>3 - Cambiar el nombre de una annotated tag</h3>
<div class="codehilite"><pre><span></span><code>git tag &lt;new&gt; &lt;old&gt; -f -a
</code></pre></div>
<h3>4 - Deshabilitar fast forward por default</h3>
<div class="codehilite"><pre><span></span><code>git config --global merge.ff <span class="nb">false</span>
</code></pre></div>
<h3>5 - Siempre firmar commits</h3>
<div class="codehilite"><pre><span></span><code>git config --global commit.gpgsign <span class="nb">true</span>
</code></pre></div>
<h3>6 - Siempre mostrar diff en commit</h3>
<div class="codehilite"><pre><span></span><code>git config --global commit.verbose <span class="nb">true</span>
</code></pre></div>
<h3>7 - Push tags</h3>
<div class="codehilite"><pre><span></span><code>git push --tags
</code></pre></div>
<p>Esta lista ira creciendo a medida que valla necesitando nuevos comandos :3</p>
</div>
<script>
function makeImagesClickeable() {
document.querySelectorAll("img").forEach(img => {
img.addEventListener("click", e => window.open(e.target.src))
});
}
window.addEventListener('load', (event) => {
makeImagesClickeable();
});
</script>
</body>
</html>

View File

@@ -1,93 +0,0 @@
<!DOCTYPE html>
<html lang="es">
<head>
<title>Daniel Cortés</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width-device-width, initial-scale=1">
<meta name="author" content="Daniel Cortés">
<link rel="stylesheet" href="/assets/style.css" type="text/css">
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>
<div class="container">
<h1>Cosas que olvido sobre SQL</h1>
<p><time datetime="2019-10-23"> Oct 23, 2019 </time></p>
<p>Si bien considero saber usar SQL al nivel suficiente con el cual hacer una
aplicación simple, al menos nunca me he visto en la necesidad de ir mas allá de
hacer un left join, siempre olvido su sintaxis, por eso aquí mantendré una lista
de comandos que uso constantemente.</p>
<p>Todos los datos son basados en MySQL, que es la base de datos que mas utilizo.</p>
<h2>1 - Crear tabla</h2>
<div class="codehilite"><pre><span></span><code><span class="k">create</span> <span class="k">table</span> <span class="n">usuario</span>
<span class="p">(</span>
<span class="n">id</span> <span class="nb">int</span> <span class="k">primary</span> <span class="k">key</span> <span class="n">auto_increment</span><span class="p">,</span>
<span class="n">nombre</span> <span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">)</span> <span class="k">not</span> <span class="k">null</span><span class="p">,</span>
<span class="n">password</span> <span class="nb">binary</span><span class="p">(</span><span class="mi">32</span><span class="p">)</span> <span class="k">not</span> <span class="k">null</span><span class="p">,</span>
<span class="n">salt</span> <span class="nb">binary</span><span class="p">(</span><span class="mi">16</span><span class="p">)</span> <span class="k">not</span> <span class="k">null</span><span class="p">,</span>
<span class="n">trabajador</span> <span class="nb">int</span> <span class="k">not</span> <span class="k">null</span><span class="p">,</span>
<span class="k">foreign</span> <span class="k">key</span> <span class="p">(</span><span class="n">trabajador</span><span class="p">)</span> <span class="k">references</span> <span class="n">trabajador</span> <span class="p">(</span><span class="n">id</span><span class="p">),</span>
<span class="n">inserted_at</span> <span class="k">timestamp</span><span class="p">,</span>
<span class="n">modified_at</span> <span class="k">timestamp</span><span class="p">,</span>
<span class="p">);</span>
</code></pre></div>
<h2>2 - Como usar on delete y on update</h2>
<p>Cuando se crean foreign keys se tiene la opción de agregar on delete y on update
constraints, siempre olvido exactamente que significa cada modo de estos
constraints así que para ilustrarlos usare el siguiente modelo:</p>
<div class="codehilite"><pre><span></span><code><span class="k">create</span> <span class="k">table</span> <span class="n">trabajador</span>
<span class="p">(</span>
<span class="n">id</span> <span class="nb">int</span> <span class="k">primary</span><span class="p">,</span>
<span class="n">nombre</span> <span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">)</span> <span class="k">not</span> <span class="k">null</span>
<span class="p">);</span>
<span class="k">create</span> <span class="k">table</span> <span class="n">usuario</span>
<span class="p">(</span>
<span class="n">id</span> <span class="nb">int</span> <span class="k">primary</span> <span class="k">key</span><span class="p">,</span>
<span class="n">nombre</span> <span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">)</span> <span class="k">not</span> <span class="k">null</span><span class="p">,</span>
<span class="n">trabajador_id</span> <span class="nb">int</span> <span class="k">not</span> <span class="k">null</span><span class="p">,</span>
<span class="k">foreign</span> <span class="k">key</span> <span class="p">(</span><span class="n">trabajador_id</span><span class="p">)</span> <span class="k">references</span> <span class="n">trabajador</span> <span class="k">on</span> <span class="p">(</span><span class="n">id</span><span class="p">)</span>
<span class="p">);</span>
</code></pre></div>
<h3><code>ON UPDATE</code></h3>
<ul>
<li><code>RESTRICT</code> (default): Si es que se intenta actualizar el id de la tabla
trabajador la operación sera rechazada mientras exista al menos un usuario
que referencie a ese trabajador.</li>
<li><code>NO ACTION</code>: Lo mismo que <code>RESTRICT</code>.</li>
<li><code>CASCADE</code>: Si es que se intenta actualizar el id del trabajador, el id
también sera actualizado en todos los usuarios que referencien al
trabajador.</li>
<li><code>SET NULL</code>: Al cambiar el id del trabajador, las referencias a este id en
la tabla usuario se harán nulas.</li>
</ul>
<h3><code>ON DELETE</code></h3>
<ul>
<li><code>RESTRICT</code> (default): Si es que se intenta eliminar el trabajador la
operación sera rechazada mientras exista al menos un usuario que tenga una
referencia a ese trabajador.</li>
<li><code>NO ACTION</code>: Lo mismo que <code>RESTRICT</code>.</li>
<li><code>CASCADE</code>: Al eliminar un trabajador también se eliminaran todos los
usuarios que tengan su id asociado.</li>
<li><code>SET NULL</code>: Cuando se elimine un trabajador, todas sus referencias en la
tabla usuarios sera llenadas con nulls.</li>
</ul>
<h2>3 - Creación de foreign keys fuera del create table</h2>
<div class="codehilite"><pre><span></span><code><span class="k">alter</span> <span class="k">table</span> <span class="n">usuario</span> <span class="k">add</span> <span class="k">constraint</span> <span class="n">fk_usuario_trabajador</span>
<span class="k">foreign</span> <span class="k">key</span> <span class="p">(</span><span class="n">trabajador_id</span><span class="p">)</span> <span class="k">references</span> <span class="n">trabajador</span> <span class="p">(</span><span class="n">id</span><span class="p">);</span>
</code></pre></div>
</div>
<script>
function makeImagesClickeable() {
document.querySelectorAll("img").forEach(img => {
img.addEventListener("click", e => window.open(e.target.src))
});
}
window.addEventListener('load', (event) => {
makeImagesClickeable();
});
</script>
</body>
</html>

View File

@@ -1,35 +0,0 @@
<!DOCTYPE html>
<html lang="es">
<head>
<title>Daniel Cortés</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width-device-width, initial-scale=1">
<meta name="author" content="Daniel Cortés">
<link rel="stylesheet" href="/assets/style.css" type="text/css">
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>
<div class="container">
<h1>Daniel Cortes</h1>
<ul>
<li><a href="/blog">Blog</a></li>
<li><a href="/now.html">Now</a></li>
<li><a href="/projects.html">Projects</a></li>
<li><a href="/setup.html">Setup</a></li>
<li><a href="/random.html">Random</a></li>
<li><a href="/about.html">About</a></li>
</ul>
</div>
<script>
function makeImagesClickeable() {
document.querySelectorAll("img").forEach(img => {
img.addEventListener("click", e => window.open(e.target.src))
});
}
window.addEventListener('load', (event) => {
makeImagesClickeable();
});
</script>
</body>
</html>

View File

@@ -1,28 +0,0 @@
<!DOCTYPE html>
<html lang="es">
<head>
<title>Daniel Cortés</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width-device-width, initial-scale=1">
<meta name="author" content="Daniel Cortés">
<link rel="stylesheet" href="/assets/style.css" type="text/css">
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>
<div class="container">
<h1>Now</h1>
<p>(En Construccion!)</p>
</div>
<script>
function makeImagesClickeable() {
document.querySelectorAll("img").forEach(img => {
img.addEventListener("click", e => window.open(e.target.src))
});
}
window.addEventListener('load', (event) => {
makeImagesClickeable();
});
</script>
</body>
</html>

View File

@@ -1,28 +0,0 @@
<!DOCTYPE html>
<html lang="es">
<head>
<title>Daniel Cortés</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width-device-width, initial-scale=1">
<meta name="author" content="Daniel Cortés">
<link rel="stylesheet" href="/assets/style.css" type="text/css">
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>
<div class="container">
<h1>Projects</h1>
<p>(En Construccion!)</p>
</div>
<script>
function makeImagesClickeable() {
document.querySelectorAll("img").forEach(img => {
img.addEventListener("click", e => window.open(e.target.src))
});
}
window.addEventListener('load', (event) => {
makeImagesClickeable();
});
</script>
</body>
</html>

View File

@@ -1,49 +0,0 @@
<!DOCTYPE html>
<html lang="es">
<head>
<title>Daniel Cortés</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width-device-width, initial-scale=1">
<meta name="author" content="Daniel Cortés">
<link rel="stylesheet" href="/assets/style.css" type="text/css">
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>
<div class="container">
<h1>Random Stuff</h1>
<p>Por aqui dejare links a cosas random que son interesantes, o me gustan, o simplemente quiero guardar</p>
<h2>Preguntas / Respuestas en StackOverflow</h2>
<ul>
<li><a href="https://stackoverflow.com/questions/7745609/sql-select-only-rows-with-max-value-on-a-column">SQL select only rows with max value on a column</a></li>
<li><a href="https://stackoverflow.com/questions/11919708/set-of-unambiguous-looking-letters-numbers-for-user-input">Set of unambiguous looking letters &amp; numbers for user input</a></li>
</ul>
<h2>Blog posts de otros</h2>
<ul>
<li><a href="https://blog.cerebralab.com/Bimodal_programming_%E2%80%93_why_design_patterns_fail">Bimodal programming why design patterns fail</a></li>
<li><a href="https://www.robinsloan.com/notes/home-cooked-app/">An app can be a home-cooked meal</a></li>
<li><a href="https://datagubbe.se/decusab/">The Decline of Usability</a></li>
<li><a href="https://baekdal.com/thoughts/the-original-cookie-specification-from-1997-was-gdpr-compliant/">The Original Cookie specification from 1997 was GDPR compliant</a></li>
<li><a href="https://tonsky.me/blog/syncthing/">Computers as I used to love them</a></li>
</ul>
<h2>Recursos</h2>
<ul>
<li><a href="https://wcodes.org/">Wcode - Usar palabras para transmitir codigos de uso humano</a></li>
</ul>
<h2>Videos</h2>
<ul>
<li><a href="https://www.youtube.com/watch?v=o9pEzgHorH0">Jack Diederich - Stop Writing Classes</a></li>
</ul>
</div>
<script>
function makeImagesClickeable() {
document.querySelectorAll("img").forEach(img => {
img.addEventListener("click", e => window.open(e.target.src))
});
}
window.addEventListener('load', (event) => {
makeImagesClickeable();
});
</script>
</body>
</html>

View File

@@ -1,9 +0,0 @@
function makeImagesClickeable() {
document.querySelectorAll("img").forEach(img => {
img.addEventListener("click", e => window.open(e.target.src))
});
}
window.addEventListener('DOMContentLoaded', (event) => {
makeImagesClickeable();
});

View File

@@ -1,154 +0,0 @@
<!DOCTYPE html>
<html lang="es">
<head>
<title>Daniel Cortés</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width-device-width, initial-scale=1">
<meta name="author" content="Daniel Cortés">
<link rel="stylesheet" href="/assets/style.css" type="text/css">
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>
<div class="container">
<h1>Setup</h1>
<p><time datetime="2020-04-07"> Abr 7, 2020 </time></p>
<p><img alt="Screenshot de mi setup" src="https://static.danielcortes.xyz/images/1586308490.png" /></p>
<p>Actualmente el setup que estoy usando a cambiado, ya no puedo utilizar un tiling window manager como <code>herbstluftwm</code>, porque estoy obligado a usar VirtualBox para poder correr Microsoft Teams, que es lo que esta utilizando mi universidad para hacer clases y VirtualBox tiene problemas al entrar a modo fullscreen o seamless.</p>
<p>Así que bueno, me cambie a <code>cwm</code> el cual es un stacking window manager desarrollado como parte de <code>OpenBSD</code>, usa tan solo un archivo de configuración en el <code>$HOME</code> donde se pueden configurar grupos, los que son equivalente a los típicos workspaces, y cambiar los key bindings para ejecutar programas, mover ventanas en la pantalla y entre grupos, hay solo un par de opciones mas que cambiar en realidad por lo que se siente bastante minimalista comparado con <code>OpenBox</code> por usar XML y tener mil opciones.</p>
<p>La configuración que estoy usando para <code>cwm</code> es la siguiente:</p>
<div class="codehilite"><pre><span></span><code>moveamount <span class="m">10</span>
gap <span class="m">25</span> <span class="m">15</span> <span class="m">15</span> <span class="m">15</span>
ignore polybar
sticky yes
autogroup <span class="m">1</span> Firefox
autogroup <span class="m">8</span> Spotify
autogroup <span class="m">9</span> Thunderbird
unbind-key all
unbind-mouse all
bind-key 4S-r restart
bind-key 4S-e quit
bind-key <span class="m">4</span>-d <span class="s2">&quot;dmenu_custom -r -e cwm&quot;</span>
bind-key 4C-h window-resize-left
bind-key 4C-j window-resize-down
bind-key 4C-k window-resize-up
bind-key 4C-l window-resize-right
bind-key <span class="m">4</span>-f window-maximize
bind-key 4S-f window-fullscreen
bind-key M-Tab window-cycle-ingroup
bind-key 4S-q window-delete
bind-mouse <span class="m">4</span>-1 window-move
bind-mouse <span class="m">4</span>-3 window-resize
bind-mouse <span class="m">4</span>-2 window-stick
bind-key <span class="m">4</span>-1 group-only-1
bind-key <span class="m">4</span>-2 group-only-2
bind-key <span class="m">4</span>-3 group-only-3
bind-key <span class="m">4</span>-4 group-only-4
bind-key <span class="m">4</span>-5 group-only-5
bind-key <span class="m">4</span>-6 group-only-6
bind-key <span class="m">4</span>-7 group-only-7
bind-key <span class="m">4</span>-8 group-only-8
bind-key <span class="m">4</span>-9 group-only-9
bind-key 4S-1 window-movetogroup-1
bind-key 4S-2 window-movetogroup-2
bind-key 4S-3 window-movetogroup-3
bind-key 4S-4 window-movetogroup-4
bind-key 4S-5 window-movetogroup-5
bind-key 4S-6 window-movetogroup-6
bind-key 4S-7 window-movetogroup-7
bind-key 4S-8 window-movetogroup-8
bind-key 4S-9 window-movetogroup-9
bind-key 4S-h <span class="s2">&quot;tile l&quot;</span>
bind-key 4S-j <span class="s2">&quot;tile b&quot;</span>
bind-key 4S-k <span class="s2">&quot;tile t&quot;</span>
bind-key 4S-l <span class="s2">&quot;tile r&quot;</span>
bind-key <span class="m">4</span>-h <span class="s2">&quot;move l&quot;</span>
bind-key <span class="m">4</span>-j <span class="s2">&quot;move b&quot;</span>
bind-key <span class="m">4</span>-k <span class="s2">&quot;move t&quot;</span>
bind-key <span class="m">4</span>-l <span class="s2">&quot;move r&quot;</span>
</code></pre></div>
<p>Realmente la mayoría de la configuración que tengo es para mover las ventanas alrededor al estilo de un tiling window manager, porque esas costumbres no mueren.</p>
<p>Lo otro que tengo es <code>polybar</code> con un script bastante pequeño, porque cuando configure esto mi idea era que realmente era un ambiente para usar solo la maquina virtual de Windows, por lo que lo único que necesitaría saber en cada momento era la hora, si mi micrófono esta muteado y la batería disponible.</p>
<div class="codehilite"><pre><span></span><code><span class="k">[bar/bar]</span>
<span class="na">width</span> <span class="o">=</span> <span class="s">100%</span>
<span class="na">height</span> <span class="o">=</span> <span class="s">15 </span>
<span class="na">override-redirect</span><span class="o">=</span><span class="s">true</span>
<span class="na">background</span> <span class="o">=</span> <span class="s">${xrdb:background:#222}</span>
<span class="na">foreground</span> <span class="o">=</span> <span class="s">${xrdb:foreground:#fff}</span>
<span class="na">padding</span> <span class="o">=</span> <span class="s">3</span>
<span class="na">module-margin</span> <span class="o">=</span> <span class="s">1</span>
<span class="na">font-0</span> <span class="o">=</span> <span class="s">&quot;monospace:pixelsize=10;0&quot;</span>
<span class="na">separator</span> <span class="o">=</span> <span class="s">|</span>
<span class="na">wm-name</span> <span class="o">=</span> <span class="s">polybar</span>
<span class="na">modules-left</span> <span class="o">=</span> <span class="s">window</span>
<span class="na">modules-right</span> <span class="o">=</span> <span class="s">muted date battery</span>
<span class="k">[module/window]</span>
<span class="na">type</span> <span class="o">=</span> <span class="s">internal/xwindow</span>
<span class="k">[module/battery]</span>
<span class="na">type</span> <span class="o">=</span> <span class="s">internal/battery</span>
<span class="na">battery</span> <span class="o">=</span> <span class="s">BAT0</span>
<span class="na">adapter</span> <span class="o">=</span> <span class="s">AC</span>
<span class="na">full-at</span> <span class="o">=</span> <span class="s">100</span>
<span class="k">[module/date]</span>
<span class="na">type</span> <span class="o">=</span> <span class="s">internal/date</span>
<span class="na">interval</span> <span class="o">=</span> <span class="s">10</span>
<span class="na">date</span> <span class="o">=</span> <span class="s">%d/%m</span>
<span class="na">time</span> <span class="o">=</span> <span class="s">%H:%M</span>
<span class="na">label</span> <span class="o">=</span> <span class="s">%time%</span>
<span class="k">[module/muted]</span>
<span class="na">type</span> <span class="o">=</span> <span class="s">custom/script</span>
<span class="na">exec</span> <span class="o">=</span> <span class="s">is_muted</span>
<span class="na">tail</span> <span class="o">=</span> <span class="s">true</span>
</code></pre></div>
<p>Para configurar el color y todo eso estoy simplemente usando pywal con la imagen de fondo y la saturacion al 100%</p>
<p>Lo ultimo que afecta directamente a todo lo que hago, es la configuración de <code>urxvt</code>, la cual igual que todo, bastante cortita, la fuente que sea la <code>monospace</code> global, actualmente es <code>envypn</code>, un borde interno y quitando la scrollbar que realmente no hace falta.</p>
<div class="codehilite"><pre><span></span><code><span class="err">URxvt.font: xft:monospace</span>
<span class="err">URxvt.letterSpace: 0</span>
<span class="err">URxvt.lineSpace: 1</span>
<span class="err">URxvt.internalBorder: 30</span>
<span class="err">URxvt.cursorBlink: true</span>
<span class="err">URxvt.cursorUnderline: false</span>
<span class="err">URxvt.scrollBar: false</span>
<span class="err">URxvt.saveLines: 10000</span>
<span class="err">URxvt.depth: 32</span>
</code></pre></div>
<p>Y eso es en resumen este setup que ocupo ahorita, hay unos cuantos scripts que uso comúnmente, <code>screenshot</code>, <code>is_mute</code>, <code>move</code>, <code>tile</code> y <code>cpu</code>, ademas de varios programas que uso siempre, <code>dmenu</code>, <code>pass</code>, <code>sxhkd</code> y otros, todo esto esta subido a mi <code>git</code>, al menos lo intento mantener actualizado.</p>
</div>
<script>
function makeImagesClickeable() {
document.querySelectorAll("img").forEach(img => {
img.addEventListener("click", e => window.open(e.target.src))
});
}
window.addEventListener('load', (event) => {
makeImagesClickeable();
});
</script>
</body>
</html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB