-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.xml
More file actions
54 lines (54 loc) · 25.3 KB
/
index.xml
File metadata and controls
54 lines (54 loc) · 25.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Aleksandar's Blog</title>
<link>https://vulkoingim.github.io/</link>
<description>Recent content on Aleksandar's Blog</description>
<generator>Hugo</generator>
<language>en-us</language>
<lastBuildDate>Mon, 21 Jul 2025 18:01:52 +0000</lastBuildDate>
<atom:link href="https://vulkoingim.github.io/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Riff Radar is Live</title>
<link>https://vulkoingim.github.io/posts/riffradar-is-live/</link>
<pubDate>Mon, 21 Jul 2025 18:01:52 +0000</pubDate>
<guid>https://vulkoingim.github.io/posts/riffradar-is-live/</guid>
<description><blockquote>
<p>note: this blog post is going to live here for now, until I set-up the <a href="https://riffradar.org">riffradar.org</a> blog properly</p>
</blockquote>
<p>You follow hundreds (or thousands) of artists on Spotify, but somehow you always end up listening to the same songs over and over again? You know there&rsquo;s amazing music buried in your follows, but it never gets surfaced. That band you discovered somewhere, followed, then completely forgot existed?</p>
<p>That&rsquo;s exactly where I was, and that&rsquo;s why I built Riff Radar.</p></description>
</item>
<item>
<title>Sourdough Buddy</title>
<link>https://vulkoingim.github.io/posts/sourdough-buddy/</link>
<pubDate>Tue, 25 Mar 2025 15:11:27 +0000</pubDate>
<guid>https://vulkoingim.github.io/posts/sourdough-buddy/</guid>
<description><style>
 .calc-container {
 font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
 line-height: 1;
 color: #333;
 width: 100%;
 margin: 0 auto;
 padding: 3px;
 font-size: 1.2em;
 box-sizing: border-box;
 }
 
 .calc-container h1 {
 text-align: center;
 color: #5a3921;
 margin-bottom: 15px;
 font-size: 1.8em;
 }
 
 .calc-container .calc-grid {
 display: grid;
 grid-template-columns: repeat(4, 1fr);
 gap: 3px;
 width: 100%;
 box-sizing: border-box;
 }
 
 .calc-container .card {
 background: #fff;
 border-radius: 2px;
 box-shadow: 0 1px 2px rgba(0,0,0,0.1);
 padding: 3px;
 margin-bottom: 0;
 }
 
 .calc-container .card h2 {
 color: #5a3921;
 margin: 0 0 10px 0;
 padding-bottom: 8px;
 border-bottom: 1px solid #eee;
 font-size: 1.2em;
 }

 .calc-container .card h3 {
 color: #5a3921;
 margin: 15px 0 8px 0;
 font-size: 1.1em;
 }
 
 .calc-container table {
 width: 100%;
 border-collapse: collapse;
 font-size: 0.7em;
 }
 
 .calc-container td, .calc-container th {
 padding: 1px 2px;
 text-align: left;
 }
 
 .calc-container tr:nth-child(even) {
 background-color: #f9f5f0;
 }
 
 .calc-container input {
 width: 40px;
 padding: 1px;
 border: 1px solid #ddd;
 border-radius: 1px;
 font-size: 0.7em;
 }
 
 .calc-container input[type="text"] {
 width: 90%;
 font-size: 0.7em;
 }
 
 .calc-container input:focus {
 border-color: #8b6b4a;
 outline: none;
 }
 
 .calc-container .total-row {
 font-weight: bold;
 border-top: 1px solid #ddd;
 }
 
 .calc-container .note {
 font-size: 0.8em;
 color: #666;
 font-style: italic;
 text-align: center;
 margin-top: 15px;
 }

 
 .tab-navigation {
 display: flex;
 align-items: center;
 margin-bottom: 20px;
 border-bottom: 1px solid #eee;
 padding-bottom: 10px;
 width: 100%;
 box-sizing: border-box;
 }

 .tab-buttons {
 display: flex;
 flex-grow: 1;
 gap: 5px;
 }

 .tab-button {
 background: #f9f5f0;
 border: 1px solid #ddd;
 border-radius: 4px 4px 0 0;
 padding: 8px 16px;
 cursor: pointer;
 font-size: 0.9em;
 color: #666;
 transition: all 0.2s ease;
 position: relative;
 }

 .tab-button:hover {
 background: #fff;
 color: #5a3921;
 }

 .tab-button.active {
 background: #fff;
 border-bottom: 1px solid #fff;
 color: #5a3921;
 font-weight: bold;
 }

 .tab-button .tab-name {
 display: inline-block;
 max-width: 120px;
 overflow: hidden;
 text-overflow: ellipsis;
 white-space: nowrap;
 }

 .tab-button .tab-close {
 margin-left: 8px;
 color: #999;
 font-weight: bold;
 cursor: pointer;
 opacity: 0.6;
 }

 .tab-button .tab-close:hover {
 opacity: 1;
 color: #666;
 }

 .tab-button .tab-edit {
 margin-left: 4px;
 color: #999;
 font-size: 0.8em;
 cursor: pointer;
 opacity: 0.6;
 padding: 2px;
 }

 .tab-button .tab-edit:hover {
 opacity: 1;
 color: #666;
 }

 .tab-name-input {
 background: transparent;
 border: 1px solid #ddd;
 border-radius: 3px;
 padding: 2px 6px;
 font-size: 0.9em;
 width: 100px;
 outline: none;
 }

 .add-tab-btn {
 background: #5a3921;
 color: white;
 border: none;
 border-radius: 50%;
 width: 30px;
 height: 30px;
 font-size: 16px;
 font-weight: bold;
 cursor: pointer;
 margin-left: 10px;
 transition: background-color 0.2s ease;
 }

 .add-tab-btn:hover {
 background: #4a2d1a;
 }

 .tab-content {
 min-height: 400px;
 width: 100%;
 box-sizing: border-box;
 }

 @media (max-width: 768px) {
 .calc-container .calc-grid {
 grid-template-columns: 1fr;
 }

 .calc-container {
 padding: 10px;
 }

 .calc-container .card {
 padding: 10px;
 }

 .calc-container table {
 font-size: 0.85em;
 }

 .calc-container td, .calc-container th {
 padding: 3px 4px;
 }

 .calc-container input {
 width: 50px;
 padding: 3px;
 }

 .tab-button {
 padding: 6px 12px;
 font-size: 0.8em;
 }

 .tab-button .tab-name {
 max-width: 80px;
 }
 }
</style>

<div class="calc-container">
 
 <div class="tab-navigation">
 <div class="tab-buttons" id="tabButtons"></div>
 <button class="add-tab-btn" onclick="addNewTab()">+</button>
 </div>

 <div class="tab-content" id="tabContent">
 <div class="calc-grid" id="calculatorContent">
 <div class="card">
 <h2>Base Formula</h2>
 <table>
 <tr>
 <td>Dough weight (g)</td>
 <td><input type="number" id="doughWeight" value="610" onchange="calculateAll()"></td>
 </tr>
 <tr>
 <td>Levain (%)</td>
 <td><input type="number" id="levainPercent" value="20" onchange="calculateAll()"></td>
 </tr>
 <tr>
 <td>Scale</td>
 <td><input type="number" id="scale" value="1" step="1" onchange="calculateAll()"></td>
 </tr>
 <tr>
 <td>Hydration</td>
 <td><input type="number" id="waterPercent" value="65" onchange="calculateAll()">%</td>
 <td id="totalWater" style="display: none;">237</td>
 </tr>
 <tr>
 <td>Salt</td>
 <td><input type="number" id="saltPercent" value="2.0" step="0.1" onchange="calculateAll()">%</td>
 <td id="totalSalt" style="display: none;">7</td>
 </tr>
 <tr>
 <td style="display: none;">Pre-fermented flour (g)</td>
 <td id="pff" style="display: none;">37</td>
 </tr>
 <tr>
 <td style="display: none;">PFF (%)</td>
 <td id="pffPercent" style="display: none;">10%</td>
 </tr>
 </table>
 </div>
 
 <div class="card">
 <h2>Total Ingredients</h2>
 <table>
 <tr>
 <th>Ingredient</th>
 <th>Baker's %</th>
 <th style="display: none;">Weight (g)</th>
 </tr>
 <tr>
 <td><input type="text" id="strongFlourName" value="Strong white flour" onchange="updateNames()"></td>
 <td><input type="number" id="strongFlourPercent" value="100" onchange="calculateAll()">%</td>
 <td id="totalStrongFlour" style="display: none;">365</td>
 </tr>
 <tr>
 <td><input type="text" id="plainFlourName" value="Plain flour" onchange="updateNames()"></td>
 <td><input type="number" id="plainFlourPercent" value="0" onchange="calculateAll()">%</td>
 <td id="totalPlainFlour" style="display: none;">0</td>
 </tr>
 <tr>
 <td><input type="text" id="flour3Name" value="Flour 3" onchange="updateNames()"></td>
 <td><input type="number" id="flour3Percent" value="0" onchange="calculateAll()">%</td>
 <td id="totalFlour3" style="display: none;">0</td>
 </tr>
 <tr>
 <td><input type="text" id="inclusion1Name" value="Inclusion 1" onchange="updateNames()"></td>
 <td><input type="number" id="inclusion1Percent" value="0" onchange="calculateAll()">%</td>
 <td id="totalInclusion1" style="display: none;">0</td>
 </tr>
 <tr>
 <td><input type="text" id="inclusion2Name" value="Inclusion 2" onchange="updateNames()"></td>
 <td><input type="number" id="inclusion2Percent" value="0" onchange="calculateAll()">%</td>
 <td id="totalInclusion2" style="display: none;">0</td>
 </tr>
 <tr>
 <td><input type="text" id="inclusion3Name" value="Inclusion 3" onchange="updateNames()"></td>
 <td><input type="number" id="inclusion3Percent" value="0" onchange="calculateAll()">%</td>
 <td id="totalInclusion3" style="display: none;">0</td>
 </tr>
 <tr class="total-row" style="display: none;">
 <td>Total weight</td>
 <td id="totalPercent">167%</td>
 <td id="totalWeight" style="display: none;">610</td>
 </tr>
 </table>
 </div>
 
 <div class="card">
 <h2>Ferments</h2>
 
 <h3>Ripe Starter</h3>
 <table>
 <tr>
 <th>Ingredient</th>
 <th>Baker's %</th>
 <th>Weight (g)</th>
 </tr>
 <tr>
 <td>Flour</td>
 <td>100%</td>
 <td id="starterFlour">12</td>
 </tr>
 <tr>
 <td>Water</td>
 <td><input type="number" id="starterWaterPercent" value="100" onchange="calculateAll()">%</td>
 <td id="starterWater">12</td>
 </tr>
 <tr class="total-row">
 <td>Total weight</td>
 <td id="starterTotalPercent" style="display: none;">200%</td>
 <td></td>
 <td id="starterTotalWeight">24</td>
 </tr>
 </table>
 
 <h3>Levain Build</h3>
 <table>
 <tr>
 <th>Ingredient</th>
 <th>Baker's %</th>
 <th>Weight (g)</th>
 </tr>
 <tr>
 <td><input type="text" id="levainFlourName" value="Whole rye flour" onchange="updateNames()"></td>
 <td><input type="number" id="levainFlourPercent" value="350" onchange="calculateAll()">%</td>
 <td id="levainFlour">24</td>
 </tr>
 <tr>
 <td>Water</td>
 <td><input type="number" id="levainWaterPercent" value="350" onchange="calculateAll()">%</td>
 <td id="levainWater">24</td>
 </tr>
 <tr>
 <td>Ripe starter</td>
 <td><input type="number" id="ripeStarterPercent" value="100" onchange="calculateAll()">%</td>
 <td id="levainStarter">24</td>
 </tr>
 <tr class="total-row">
 <td>Total weight</td>
 <td id="levainTotalPercent" style="display: none;">300%</td>
 <td></td>
 <td id="levainTotalWeight">73</td>
 </tr>
 </table>
 </div>
 
 <div class="card">
 <h2>Main Dough Recipe</h2>
 <table>
 <tr>
 <th>Ingredient</th>
 <th>Weight (g)</th>
 </tr>
 <tr>
 <td id="mainStrongFlourName">Strong white flour</td>
 <td id="mainStrongFlour">329</td>
 </tr>
 <tr>
 <td id="mainPlainFlourName">Plain flour</td>
 <td id="mainPlainFlour">0</td>
 </tr>
 <tr>
 <td id="mainFlour3Name">Flour 3</td>
 <td id="mainFlour3">0</td>
 </tr>
 <tr>
 <td>Water</td>
 <td id="mainWater">201</td>
 </tr>
 <tr>
 <td>Salt</td>
 <td id="mainSalt">7</td>
 </tr>
 <tr>
 <td>Levain</td>
 <td id="mainLevain">73</td>
 </tr>
 <tr>
 <td id="mainInclusion1Name">Inclusion 1</td>
 <td id="mainInclusion1">0</td>
 </tr>
 <tr>
 <td id="mainInclusion2Name">Inclusion 2</td>
 <td id="mainInclusion2">0</td>
 </tr>
 <tr>
 <td id="mainInclusion3Name">Inclusion 3</td>
 <td id="mainInclusion3">0</td>
 </tr>
 <tr class="total-row">
 <td>Total weight</td>
 <td id="mainTotalWeight">610</td>
 </tr>
 </table>
 </div>
 </div>
 </div>

 <p class="note">Note: Modify any value with an input field to recalculate the recipe.</p></description>
</item>
<item>
<title>Obsidian Location</title>
<link>https://vulkoingim.github.io/posts/obsidian-location/</link>
<pubDate>Wed, 13 Nov 2024 14:01:52 +0000</pubDate>
<guid>https://vulkoingim.github.io/posts/obsidian-location/</guid>
<description><p>Recently I started using Obsidian and journaling daily. It took no time for me to start tracking all kinds of things for each day, and naturally some of those things ended up being my location and the weather.</p>
<p>It turns out that getting your accurate location in Obsidian is a bit of a pain in the ass. Most of the solutions I saw online were based on determining your location <a href="https://forum.obsidian.md/t/mobile-can-obsidian-api-provide-current-geo-location-gps-on-android-ios/21638/8">from your IP address</a> which is, needless to say, wildly inaccurate. Others required you to <a href="https://github.com/esm7/obsidian-map-view#gps-location-support">run a separate (Android) app, or go through a web page</a></p></description>
</item>
<item>
<title>Obsidian Read It Later</title>
<link>https://vulkoingim.github.io/posts/obsidian-read-it-later/</link>
<pubDate>Tue, 12 Nov 2024 17:11:27 +0000</pubDate>
<guid>https://vulkoingim.github.io/posts/obsidian-read-it-later/</guid>
<description><p>I&rsquo;ve always been hoarding hundreds of tabs in my browser, thinking that I&rsquo;ll eventually get back to that article and read it at some point in the future. At some point I discovered read-it-later apps - like <code>Pocket</code> and started hoarding things there <del>instead</del> as well. For some unknown reason I&rsquo;ve always aspired to read those things I&rsquo;ve saved at some later date&hellip;</p>
<p>It very rarely happened.</p>
<p>Some time passed and I decided that I&rsquo;ll cut my losses and start fresh, and I started using <code>Omnivore</code> - with mixed results. Well, recently it was announced it was <a href="https://blog.omnivore.app/p/details-on-omnivore-shutting-down">shutting down</a>, so my initial reaction was to look for yet another alternative. Surprise surprise.</p></description>
</item>
<item>
<title>yubikey/touch id sudo on osx</title>
<link>https://vulkoingim.github.io/posts/yubi-touch-sudo/</link>
<pubDate>Sun, 24 Dec 2023 12:28:48 +0000</pubDate>
<guid>https://vulkoingim.github.io/posts/yubi-touch-sudo/</guid>
<description><p>This is a bit expanded version of the <a href="https://gist.github.com/tresni/1da3a1dcd0abbd9591e739b0b59cbf5f">gist</a>, with some
updated instructions to also accommodate TouchID and manual compilation of <code>pam_yubico</code>.</p>
<h1 id="setup">Setup</h1>
<ol>
<li>Dependencies</li>
</ol>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>brew install ykman pam_yubico
</span></span></code></pre></div><ol>
<li>Generate a new, random challenge-response secret in slot 2, require touch (<code>-t</code>)</li>
</ol>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>ykman otp chalresp <span style="color:#2aa198">2</span> -g -t
</span></span></code></pre></div><ol>
<li>Create required directory w/ required permissions</li>
</ol>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>mkdir -m0755 -p ~/.yubico
</span></span></code></pre></div><ol>
<li>Generate the initial challenge from the Yubikey</li>
</ol>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>kpamcfg -2
</span></span></code></pre></div><ol>
<li>Create the <code>sudo_local</code> file and edit it.</li>
</ol>
<blockquote>
<p>⚠️ Warning</p></description>
</item>
<item>
<title>About</title>
<link>https://vulkoingim.github.io/about/</link>
<pubDate>Sun, 05 Jan 2020 20:38:09 +0000</pubDate>
<guid>https://vulkoingim.github.io/about/</guid>
<description></description>
</item>
</channel>
</rss>