Eliminado venv y www del repositorio, agrege un requirements igual

This commit is contained in:
2020-11-22 21:14:46 -03:00
parent 18cf2d335a
commit 199a1e2a61
820 changed files with 15495 additions and 22017 deletions

View File

@@ -35,7 +35,7 @@ las redes sociales como ya lo hice con Facebook.</p>
});
}
window.addEventListener('DOMContentLoaded', (event) => {
window.addEventListener('load', (event) => {
makeImagesClickeable();
});
</script>

View File

@@ -1,55 +1,3 @@
/******************************************************************************
=> 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 .hll { background-color: #f1fa8c }
.codehilite { background: #282a36; color: #f8f8f2 }
.codehilite .c { color: #6272a4 } /* Comment */
@@ -127,6 +75,79 @@
.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
@@ -476,96 +497,62 @@ template {
[hidden] {
display: none;
}
: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;
}
/******************************************************************************
=> FONTS
=> 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}
/******************************************************************************
=> 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}
/******************************************************************************
=> 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}
/******************************************************************************
=> MAIN STYLES
*******************************************************************************/
@@ -641,3 +628,16 @@ code {
.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

@@ -18,37 +18,37 @@ 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>
<pre class="codehilite"><code class="language-java">String[] things = {
&quot;ball&quot;, &quot;celery&quot;, &quot;hand&quot;, &quot;celery&quot;,
&quot;mind&quot;, &quot;ball&quot;, &quot;fresh&quot;, &quot;hand&quot;, &quot;ball&quot;,
&quot;fresh&quot;, &quot;fresh&quot;
};
<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>
Map&lt;String, Integer&gt; oldWay = new HashMap&lt;&gt;();
<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>
for (String thing : things) {
if (oldWay.containsKey(thing)) {
oldWay.put(thing, oldWay.get(thing) + 1);
} else {
oldWay.put(thing, 1);
}
}
<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>
System.out.println(&quot;ball =&gt; &quot; + oldWay.get(&quot;ball&quot;));
System.out.println(&quot;celery =&gt; &quot; + oldWay.get(&quot;celery&quot;));
System.out.println(&quot;hand =&gt; &quot; + oldWay.get(&quot;hand&quot;));
System.out.println(&quot;fresh =&gt; &quot; + oldWay.get(&quot;fresh&quot;));
System.out.println(&quot;mind =&gt; &quot; + oldWay.get(&quot;mind&quot;));</code></pre>
<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>
<pre class="codehilite"><code class="language-md">ball =&gt; 3
<div class="codehilite"><pre><span></span><code>ball =&gt; 3
celery =&gt; 2
hand =&gt; 2
fresh =&gt; 3
mind =&gt; 1</code></pre>
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
@@ -60,11 +60,11 @@ la key con el valor por default, en este caso 1.</p>
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>
<pre class="codehilite"><code class="language-java">for (String thing : things) {
eightWay.putIfAbsent(thing, 0);
eightWay.computeIfPresent(thing, (key, value) -&gt; value + 1);
}</code></pre>
<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
@@ -72,10 +72,10 @@ 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>
<pre class="codehilite"><code class="language-java">for (String thing : things) {
betterWay.merge(thing, 1, (oldValue, newValue) -&gt; oldValue + newValue);
}</code></pre>
<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á
@@ -83,10 +83,10 @@ 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>
<pre class="codehilite"><code class="language-java">for (String thing : things) {
evenBetterWay.merge(thing, 1, Integer::sum);
}</code></pre>
<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
@@ -101,7 +101,7 @@ recordar.</p>
});
}
window.addEventListener('DOMContentLoaded', (event) => {
window.addEventListener('load', (event) => {
makeImagesClickeable();
});
</script>

View File

@@ -24,7 +24,7 @@
});
}
window.addEventListener('DOMContentLoaded', (event) => {
window.addEventListener('load', (event) => {
makeImagesClickeable();
});
</script>

View File

@@ -14,32 +14,32 @@
<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>
<pre class="codehilite"><code class="language-bash">git reset HEAD -- &lt;archivo/carpeta&gt;</code></pre>
<div class="codehilite"><pre><span></span><code>git reset HEAD -- &lt;archivo/carpeta&gt;
</code></pre></div>
<h3>2 - Deshacer ultimo commit</h3>
<pre class="codehilite"><code class="language-bash">git reset --soft HEAD~1</code></pre>
<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>
<pre class="codehilite"><code class="language-bash">git tag &lt;new&gt; &lt;old&gt; -f -a</code></pre>
<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>
<pre class="codehilite"><code class="language-bash">git config --global merge.ff false</code></pre>
<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>
<pre class="codehilite"><code class="language-bash">git config --global commit.gpgsign true</code></pre>
<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>
<pre class="codehilite"><code class="language-bash">git config --global commit.verbose true</code></pre>
<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>
<pre class="codehilite"><code class="language-bash">git push --tags</code></pre>
<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>
@@ -50,7 +50,7 @@
});
}
window.addEventListener('DOMContentLoaded', (event) => {
window.addEventListener('load', (event) => {
makeImagesClickeable();
});
</script>

View File

@@ -18,37 +18,37 @@ hacer un left join, siempre olvido su sintaxis, por eso aquí mantendré una lis
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>
<pre class="codehilite"><code class="language-sql">create table usuario
(
id int primary key auto_increment,
nombre varchar(255) not null,
password binary(32) not null,
salt binary(16) not null,
trabajador int not null,
foreign key (trabajador) references trabajador (id),
inserted_at timestamp,
modified_at timestamp,
);</code></pre>
<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>
<pre class="codehilite"><code class="language-sql">create table trabajador
(
id int primary,
nombre varchar(255) not null
);
create table usuario
(
id int primary key,
nombre varchar(255) not null,
trabajador_id int not null,
foreign key (trabajador_id) references trabajador on (id)
);</code></pre>
<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>
@@ -74,8 +74,9 @@ usuarios que tengan su id asociado.</li>
tabla usuarios sera llenadas con nulls.</li>
</ul>
<h2>3 - Creación de foreign keys fuera del create table</h2>
<pre class="codehilite"><code class="language-sql">alter table usuario add constraint fk_usuario_trabajador
foreign key (trabajador_id) references trabajador (id);</code></pre>
<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() {
@@ -84,7 +85,7 @@ foreign key (trabajador_id) references trabajador (id);</code></pre>
});
}
window.addEventListener('DOMContentLoaded', (event) => {
window.addEventListener('load', (event) => {
makeImagesClickeable();
});
</script>

View File

@@ -27,7 +27,7 @@
});
}
window.addEventListener('DOMContentLoaded', (event) => {
window.addEventListener('load', (event) => {
makeImagesClickeable();
});
</script>

View File

@@ -20,7 +20,7 @@
});
}
window.addEventListener('DOMContentLoaded', (event) => {
window.addEventListener('load', (event) => {
makeImagesClickeable();
});
</script>

View File

@@ -20,7 +20,7 @@
});
}
window.addEventListener('DOMContentLoaded', (event) => {
window.addEventListener('load', (event) => {
makeImagesClickeable();
});
</script>

View File

@@ -41,7 +41,7 @@
});
}
window.addEventListener('DOMContentLoaded', (event) => {
window.addEventListener('load', (event) => {
makeImagesClickeable();
});
</script>

View File

@@ -16,48 +16,48 @@
<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>
<pre class="codehilite"><code class="language-sh">moveamount 10
gap 25 15 15 15
<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 1 Firefox
autogroup 8 Spotify
autogroup 9 Thunderbird
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 4-d &quot;dmenu_custom -r -e cwm&quot;
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 4-f window-maximize
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 4-1 window-move
bind-mouse 4-3 window-resize
bind-mouse 4-2 window-stick
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 4-1 group-only-1
bind-key 4-2 group-only-2
bind-key 4-3 group-only-3
bind-key 4-4 group-only-4
bind-key 4-5 group-only-5
bind-key 4-6 group-only-6
bind-key 4-7 group-only-7
bind-key 4-8 group-only-8
bind-key 4-9 group-only-9
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
@@ -69,73 +69,73 @@ 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 &quot;tile l&quot;
bind-key 4S-j &quot;tile b&quot;
bind-key 4S-k &quot;tile t&quot;
bind-key 4S-l &quot;tile r&quot;
bind-key 4-h &quot;move l&quot;
bind-key 4-j &quot;move b&quot;
bind-key 4-k &quot;move t&quot;
bind-key 4-l &quot;move r&quot;</code></pre>
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>
<pre class="codehilite"><code>[bar/bar]
width = 100%
height = 15
override-redirect=true
<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>
background = ${xrdb:background:#222}
foreground = ${xrdb:foreground:#fff}
<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>
padding = 3
module-margin = 1
<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>
font-0 = &quot;monospace:pixelsize=10;0&quot;
<span class="na">font-0</span> <span class="o">=</span> <span class="s">&quot;monospace:pixelsize=10;0&quot;</span>
separator = |
wm-name = polybar
<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>
modules-left = window
modules-right = muted date battery
<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>
[module/window]
type = internal/xwindow
<span class="k">[module/window]</span>
<span class="na">type</span> <span class="o">=</span> <span class="s">internal/xwindow</span>
[module/battery]
type = internal/battery
battery = BAT0
adapter = AC
full-at = 100
<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>
[module/date]
type = internal/date
interval = 10
<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>
date = %d/%m
time = %H:%M
label = %time%
[module/muted]
type = custom/script
exec = is_muted
tail = true</code></pre>
<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>
<pre class="codehilite"><code>URxvt.font: xft:monospace
URxvt.letterSpace: 0
URxvt.lineSpace: 1
URxvt.internalBorder: 30
URxvt.cursorBlink: true
URxvt.cursorUnderline: false
URxvt.scrollBar: false
URxvt.saveLines: 10000
URxvt.depth: 32</code></pre>
<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>
@@ -146,7 +146,7 @@ URxvt.depth: 32</code></pre>
});
}
window.addEventListener('DOMContentLoaded', (event) => {
window.addEventListener('load', (event) => {
makeImagesClickeable();
});
</script>