diff options
| author | Mitja Felicijan <mitja.felicijan@gmail.com> | 2023-11-01 22:54:27 +0100 |
|---|---|---|
| committer | Mitja Felicijan <mitja.felicijan@gmail.com> | 2023-11-01 22:54:27 +0100 |
| commit | 2417a6b7603524dc5cd30d29b153f91024b9443d (patch) | |
| tree | 9be5ea8e5baba96dd9159217da6badf6157fb595 /public/notes.xml | |
| parent | 89ba3497f07a8ea43d209b583f39fcc286acc923 (diff) | |
| download | mitjafelicijan.com-2417a6b7603524dc5cd30d29b153f91024b9443d.tar.gz | |
Move to Jekyll
Diffstat (limited to 'public/notes.xml')
| -rwxr-xr-x | public/notes.xml | 1569 |
1 files changed, 0 insertions, 1569 deletions
diff --git a/public/notes.xml b/public/notes.xml deleted file mode 100755 index 89e9881..0000000 --- a/public/notes.xml +++ /dev/null | |||
| @@ -1,1569 +0,0 @@ | |||
| 1 | <rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"> | ||
| 2 | <channel> | ||
| 3 | <title>Mitja Felicijan's notes</title> | ||
| 4 | <link>https://mitjafelicijan.com</link> | ||
| 5 | <description>You do not learn by relaxing. You learn by violently assaulting your problem until it surrenders its mysteries to you.</description> | ||
| 6 | <language>en-us</language> | ||
| 7 | |||
| 8 | |||
| 9 | |||
| 10 | <item> | ||
| 11 | <title>Compile drawterm on Fedora 38</title> | ||
| 12 | <link>https://mitjafelicijan.com/compile-drawterm-on-fedora-38.html</link> | ||
| 13 | <pubDate>Mon, 25 Sep 2023 09:04:28 +0200</pubDate> | ||
| 14 | <guid>https://mitjafelicijan.com/compile-drawterm-on-fedora-38.html</guid> | ||
| 15 | <description>First install two dependencies:sudo dnf install libX11-devel libXt-develClone the repo and compile it:git clone git://git.</description> | ||
| 16 | <content:encoded><p>First install two dependencies:</p> | ||
| 17 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span>sudo dnf install libX11-devel libXt-devel | ||
| 18 | </span></span></code></pre><p>Clone the repo and compile it:</p> | ||
| 19 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span>git clone git://git.9front.org/plan9front/drawterm | ||
| 20 | </span></span><span style="display:flex;"><span>cd drawterm | ||
| 21 | </span></span><span style="display:flex;"><span>CONF=unix make | ||
| 22 | </span></span></code></pre><p>That should produce <code>drawterm</code> binary.</p> | ||
| 23 | </content:encoded> | ||
| 24 | </item> | ||
| 25 | |||
| 26 | |||
| 27 | |||
| 28 | <item> | ||
| 29 | <title>AWS EB PyYAML fix</title> | ||
| 30 | <link>https://mitjafelicijan.com/aws-eb-pyyaml-fix.html</link> | ||
| 31 | <pubDate>Mon, 18 Sep 2023 07:27:29 +0200</pubDate> | ||
| 32 | <guid>https://mitjafelicijan.com/aws-eb-pyyaml-fix.html</guid> | ||
| 33 | <description>Recent update of my system completely borked EB CLIon my machine.</description> | ||
| 34 | <content:encoded><p>Recent update of my system completely borked <a href="https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb-cli3-install-advanced.html">EB CLI</a> | ||
| 35 | on my machine.</p> | ||
| 36 | <p>I tried installing it with <code>pip install awsebcli --upgrade --user</code> and it failed.</p> | ||
| 37 | <p>The error was the following.</p> | ||
| 38 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span>Collecting PyYAML&lt;6.1,&gt;=5.3.1 (from awsebcli) | ||
| 39 | </span></span><span style="display:flex;"><span> Using cached PyYAML-5.4.1.tar.gz (175 kB) | ||
| 40 | </span></span><span style="display:flex;"><span> Installing build dependencies ... done | ||
| 41 | </span></span><span style="display:flex;"><span> Getting requirements to build wheel ... error | ||
| 42 | </span></span><span style="display:flex;"><span> error: subprocess-exited-with-error | ||
| 43 | </span></span><span style="display:flex;"><span> | ||
| 44 | </span></span><span style="display:flex;"><span> × Getting requirements to build wheel did not run successfully. | ||
| 45 | </span></span><span style="display:flex;"><span> │ exit code: 1 | ||
| 46 | </span></span><span style="display:flex;"><span> ╰─&gt; [68 lines of output] | ||
| 47 | </span></span></code></pre><p>To fix this issue with PyYAML you must install PyYAML separately.</p> | ||
| 48 | <p>Do the following and try installing <code>eb</code> again after.</p> | ||
| 49 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span>echo <span style="color:#a31515">&#39;Cython &lt; 3.0&#39;</span> &gt; /tmp/constraint.txt | ||
| 50 | </span></span><span style="display:flex;"><span>PIP_CONSTRAINT=/tmp/constraint.txt pip install <span style="color:#a31515">&#39;PyYAML==5.4.1&#39;</span> | ||
| 51 | </span></span></code></pre></content:encoded> | ||
| 52 | </item> | ||
| 53 | |||
| 54 | |||
| 55 | |||
| 56 | <item> | ||
| 57 | <title>Floods in Slovenia up close</title> | ||
| 58 | <link>https://mitjafelicijan.com/floods-in-slovenia.html</link> | ||
| 59 | <pubDate>Sat, 05 Aug 2023 07:06:50 +0200</pubDate> | ||
| 60 | <guid>https://mitjafelicijan.com/floods-in-slovenia.html</guid> | ||
| 61 | <description></description> | ||
| 62 | <content:encoded><p><video src="/notes/floods/IMG_1471.mp4" controls></video></p> | ||
| 63 | <p><video src="/notes/floods/IMG_1474.mp4" controls></video></p> | ||
| 64 | <figure> | ||
| 65 | <img src="/notes/floods/IMG_1469.webp" alt="" /> | ||
| 66 | </figure> | ||
| 67 | <figure> | ||
| 68 | <img src="/notes/floods/IMG_1470.webp" alt="" /> | ||
| 69 | </figure> | ||
| 70 | <p><video src="/notes/floods/IMG_1461.mp4" controls></video></p> | ||
| 71 | <p><video src="/notes/floods/IMG_1466.mp4" controls></video></p> | ||
| 72 | </content:encoded> | ||
| 73 | </item> | ||
| 74 | |||
| 75 | |||
| 76 | |||
| 77 | <item> | ||
| 78 | <title>Make B/W SVG charts with matplotlib</title> | ||
| 79 | <link>https://mitjafelicijan.com/make-b-w-svg-charts-with-matplotlib.html</link> | ||
| 80 | <pubDate>Tue, 01 Aug 2023 17:04:10 +0200</pubDate> | ||
| 81 | <guid>https://mitjafelicijan.com/make-b-w-svg-charts-with-matplotlib.html</guid> | ||
| 82 | <description>Install pip requirements.</description> | ||
| 83 | <content:encoded><p>Install pip requirements.</p> | ||
| 84 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span>pip install matplotlib | ||
| 85 | </span></span><span style="display:flex;"><span>pip install pandas | ||
| 86 | </span></span></code></pre><p>Example of data being used.</p> | ||
| 87 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span>Epoch,Connect (NLB),Processing (NLB),Waiting (NLB),Total (NLB),Connect (ALB),Processing (ALB),Waiting (ALB),Total (ALB) | ||
| 88 | </span></span><span style="display:flex;"><span>1,57.7,315.7,309.4,321.6,9,104.4,98.3,105.7 | ||
| 89 | </span></span><span style="display:flex;"><span>2,121.9,114.4,100.3,176.9,5.8,99.1,97.1,101.1 | ||
| 90 | </span></span><span style="display:flex;"><span>3,5.3,229.4,231.2,231.4,14.2,83,69.4,87.9 | ||
| 91 | </span></span><span style="display:flex;"><span>4,4.2,134.5,112.2,135.3,5.3,132.4,105.5,134.1 | ||
| 92 | </span></span><span style="display:flex;"><span>5,5.8,247.4,246.8,248.1,6,74.3,70.2,75.5 | ||
| 93 | </span></span><span style="display:flex;"><span>6,9.9,122.9,100.6,122.7,7.5,241.1,79.3,242.3 | ||
| 94 | </span></span><span style="display:flex;"><span>7,6.1,170.2,106.4,170.5,7.2,382.4,375.1,383.8 | ||
| 95 | </span></span><span style="display:flex;"><span>8,6.6,194.3,201.4,195.5,7.1,130.9,104.8,132.6 | ||
| 96 | </span></span><span style="display:flex;"><span>9,6.4,146.1,122.3,147.7,9.4,95.6,74,96.4 | ||
| 97 | </span></span></code></pre><p>In the code you can use <code>df</code> as dataframes and use the headers like <code>df[&quot;Epoch&quot;]</code>. | ||
| 98 | This is how you get a column data with pandas.</p> | ||
| 99 | <p>The Python code responsible for generating a chart:</p> | ||
| 100 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span><span style="color:#00f">import</span> csv | ||
| 101 | </span></span><span style="display:flex;"><span><span style="color:#00f">import</span> sys | ||
| 102 | </span></span><span style="display:flex;"><span> | ||
| 103 | </span></span><span style="display:flex;"><span><span style="color:#00f">import</span> matplotlib.pyplot <span style="color:#00f">as</span> plt | ||
| 104 | </span></span><span style="display:flex;"><span><span style="color:#00f">import</span> pandas <span style="color:#00f">as</span> pd | ||
| 105 | </span></span><span style="display:flex;"><span> | ||
| 106 | </span></span><span style="display:flex;"><span><span style="color:#008000"># Read the data</span> | ||
| 107 | </span></span><span style="display:flex;"><span>df = pd.read_csv(<span style="color:#a31515">&#34;data.csv&#34;</span>) | ||
| 108 | </span></span><span style="display:flex;"><span> | ||
| 109 | </span></span><span style="display:flex;"><span><span style="color:#008000"># Settings</span> | ||
| 110 | </span></span><span style="display:flex;"><span>plt.title(<span style="color:#a31515">&#34;Connect median NLB vs ALB&#34;</span>) | ||
| 111 | </span></span><span style="display:flex;"><span>plt.tight_layout(pad=2) | ||
| 112 | </span></span><span style="display:flex;"><span>fig = plt.gcf() | ||
| 113 | </span></span><span style="display:flex;"><span>fig.set_size_inches(10, 4) | ||
| 114 | </span></span><span style="display:flex;"><span> | ||
| 115 | </span></span><span style="display:flex;"><span><span style="color:#008000"># Plotting</span> | ||
| 116 | </span></span><span style="display:flex;"><span>plt.plot(df[<span style="color:#a31515">&#34;Epoch&#34;</span>], df[<span style="color:#a31515">&#34;Connect (ALB)&#34;</span>], label = <span style="color:#a31515">&#34;ALB&#34;</span>, color=<span style="color:#a31515">&#34;black&#34;</span>, linestyle=<span style="color:#a31515">&#34;-&#34;</span>) | ||
| 117 | </span></span><span style="display:flex;"><span>plt.plot(df[<span style="color:#a31515">&#34;Epoch&#34;</span>], df[<span style="color:#a31515">&#34;Connect (NLB)&#34;</span>], label = <span style="color:#a31515">&#34;NLB&#34;</span>, color=<span style="color:#a31515">&#34;black&#34;</span>, linestyle=<span style="color:#a31515">&#34;--&#34;</span>) | ||
| 118 | </span></span><span style="display:flex;"><span> | ||
| 119 | </span></span><span style="display:flex;"><span><span style="color:#008000"># Adding x and y axis labels</span> | ||
| 120 | </span></span><span style="display:flex;"><span>plt.xlabel(<span style="color:#a31515">&#34;Epoch&#34;</span>, fontstyle=<span style="color:#a31515">&#34;italic&#34;</span>) | ||
| 121 | </span></span><span style="display:flex;"><span>plt.ylabel(<span style="color:#a31515">&#34;Median value (ms)&#34;</span>, fontstyle=<span style="color:#a31515">&#34;italic&#34;</span>) | ||
| 122 | </span></span><span style="display:flex;"><span> | ||
| 123 | </span></span><span style="display:flex;"><span><span style="color:#008000"># Legend</span> | ||
| 124 | </span></span><span style="display:flex;"><span>legend = plt.legend() | ||
| 125 | </span></span><span style="display:flex;"><span>legend.get_frame().set_linewidth(0) | ||
| 126 | </span></span><span style="display:flex;"><span> | ||
| 127 | </span></span><span style="display:flex;"><span><span style="color:#008000"># Export as SVG</span> | ||
| 128 | </span></span><span style="display:flex;"><span>plt.savefig(<span style="color:#a31515">&#34;plot.svg&#34;</span>, format=<span style="color:#a31515">&#34;svg&#34;</span>) | ||
| 129 | </span></span></code></pre><figure> | ||
| 130 | <img src="/notes/plot.svg" alt="SVG Chart" /> | ||
| 131 | </figure> | ||
| 132 | <p>The image above is SVG and you can zoom in and out and check that the image is vector.</p> | ||
| 133 | </content:encoded> | ||
| 134 | </item> | ||
| 135 | |||
| 136 | |||
| 137 | |||
| 138 | <item> | ||
| 139 | <title>Set color temperature of displays on i3</title> | ||
| 140 | <link>https://mitjafelicijan.com/set-color-temperature-of-displays-on-i3.html</link> | ||
| 141 | <pubDate>Fri, 14 Jul 2023 09:19:31 +0200</pubDate> | ||
| 142 | <guid>https://mitjafelicijan.com/set-color-temperature-of-displays-on-i3.html</guid> | ||
| 143 | <description>I have been using Gnome&#39;s night shift for a while now and I have been missingthis feature under i3wm.</description> | ||
| 144 | <content:encoded><p>I have been using Gnome's night shift for a while now and I have been missing | ||
| 145 | this feature under i3wm. This can be done with | ||
| 146 | <a href="https://linux.die.net/man/1/redshift">redshift</a>.</p> | ||
| 147 | <ul> | ||
| 148 | <li>On Debian install with <code>sudo apt install redshift</code></li> | ||
| 149 | <li>And then manually set it with <code>redshift -O 3000</code></li> | ||
| 150 | <li>Reset the current settings with <code>redshift -x</code></li> | ||
| 151 | </ul> | ||
| 152 | </content:encoded> | ||
| 153 | </item> | ||
| 154 | |||
| 155 | |||
| 156 | |||
| 157 | <item> | ||
| 158 | <title>Fix screen tearing on Debian 12 Xorg and i3</title> | ||
| 159 | <link>https://mitjafelicijan.com/fix-screen-tearing-on-debian-12-xorg-and-i3.html</link> | ||
| 160 | <pubDate>Mon, 10 Jul 2023 04:21:48 +0200</pubDate> | ||
| 161 | <guid>https://mitjafelicijan.com/fix-screen-tearing-on-debian-12-xorg-and-i3.html</guid> | ||
| 162 | <description>I have been experiencing some issues with Intel® Integrated HD Graphics 3000under Debian 12 with Xorg and i3.</description> | ||
| 163 | <content:encoded><p>I have been experiencing some issues with Intel® Integrated HD Graphics 3000 | ||
| 164 | under Debian 12 with Xorg and i3. Using <code>picom</code> compositor didn't help. To fix | ||
| 165 | this issue create new file <code>/etc/X11/xorg.conf.d/20-intel.conf</code> as root and put | ||
| 166 | the following in the file.</p> | ||
| 167 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span>Section &#34;Device&#34; | ||
| 168 | </span></span><span style="display:flex;"><span> Identifier &#34;Intel Graphics&#34; | ||
| 169 | </span></span><span style="display:flex;"><span> Driver &#34;intel&#34; | ||
| 170 | </span></span><span style="display:flex;"><span> Option &#34;TearFree&#34; &#34;true&#34; | ||
| 171 | </span></span><span style="display:flex;"><span>EndSection | ||
| 172 | </span></span></code></pre><p>Reboot the system and that should be it.</p> | ||
| 173 | </content:encoded> | ||
| 174 | </item> | ||
| 175 | |||
| 176 | |||
| 177 | |||
| 178 | <item> | ||
| 179 | <title>Online radio streaming with MPV from terminal</title> | ||
| 180 | <link>https://mitjafelicijan.com/online-radio-streaming-with-mpv-from-terminal.html</link> | ||
| 181 | <pubDate>Mon, 10 Jul 2023 03:34:45 +0200</pubDate> | ||
| 182 | <guid>https://mitjafelicijan.com/online-radio-streaming-with-mpv-from-terminal.html</guid> | ||
| 183 | <description>Recently I have been using my Thinkpad x220 more and there are some constraintsI have faced with it.</description> | ||
| 184 | <content:encoded><p>Recently I have been using my Thinkpad x220 more and there are some constraints | ||
| 185 | I have faced with it. CPU is not as powerful as on my main machine and I really | ||
| 186 | want to listen to some music while using the machine. Browsers really are bloat.</p> | ||
| 187 | <p>Check out this site <a href="https://streamurl.link/">https://streamurl.link/</a> and copy the stream url and then do | ||
| 188 | <code>mpv streamlink</code>.</p> | ||
| 189 | </content:encoded> | ||
| 190 | </item> | ||
| 191 | |||
| 192 | |||
| 193 | |||
| 194 | |||
| 195 | |||
| 196 | |||
| 197 | |||
| 198 | <item> | ||
| 199 | <title>60's IBM Computers Commercial</title> | ||
| 200 | <link>https://mitjafelicijan.com/60s-ibm-computers-commercial.html</link> | ||
| 201 | <pubDate>Thu, 29 Jun 2023 22:13:45 +0200</pubDate> | ||
| 202 | <guid>https://mitjafelicijan.com/60s-ibm-computers-commercial.html</guid> | ||
| 203 | <description>Likely aired during an hour-long program during the 1960s, long commercials suchas this typically aired during hour-long programs.</description> | ||
| 204 | <content:encoded><p>Likely aired during an hour-long program during the 1960s, long commercials such | ||
| 205 | as this typically aired during hour-long programs. They would <em>not</em> have aired | ||
| 206 | during a half-hour program.</p> | ||
| 207 | <p><video | ||
| 208 | poster="/notes/60s-ibm-computers-commercial.jpg" | ||
| 209 | src="/notes/60s-ibm-computers-commercial.mp4" | ||
| 210 | controls></video></p> | ||
| 211 | </content:encoded> | ||
| 212 | </item> | ||
| 213 | |||
| 214 | |||
| 215 | |||
| 216 | <item> | ||
| 217 | <title>10/GUI 10 Finger Multitouch User Interface</title> | ||
| 218 | <link>https://mitjafelicijan.com/10gui-10-finger-multitouch-user-interface.html</link> | ||
| 219 | <pubDate>Thu, 29 Jun 2023 14:51:39 +0200</pubDate> | ||
| 220 | <guid>https://mitjafelicijan.com/10gui-10-finger-multitouch-user-interface.html</guid> | ||
| 221 | <description>Message from 10/GUI team (page 10gui.</description> | ||
| 222 | <content:encoded><p>Message from 10/GUI team (page 10gui.com does not exist anymore):</p> | ||
| 223 | <p><em>Over a quarter-century ago, Xerox introduced the modern graphical user | ||
| 224 | interface paradigm we today take for granted.</em></p> | ||
| 225 | <p><em>That it has endured is a testament to the genius of its design. But the | ||
| 226 | industry is now at a crossroads: New technologies promise higher-bandwidth | ||
| 227 | interaction, but have yet to find a truly viable implementation.</em></p> | ||
| 228 | <p><em>10/GUI aims to bridge this gap by rethinking the desktop to leverage technology | ||
| 229 | in an intuitive and powerful way.</em></p> | ||
| 230 | <p><video | ||
| 231 | poster="/notes/10gui-10-finger-multitouch-user-interface.jpg" | ||
| 232 | src="/notes/10gui-10-finger-multitouch-user-interface.mp4" | ||
| 233 | controls></video></p> | ||
| 234 | </content:encoded> | ||
| 235 | </item> | ||
| 236 | |||
| 237 | |||
| 238 | |||
| 239 | <item> | ||
| 240 | <title>Alacritty open links with modifier</title> | ||
| 241 | <link>https://mitjafelicijan.com/alacritty-open-links-with-modifier.html</link> | ||
| 242 | <pubDate>Sun, 25 Jun 2023 17:17:16 +0200</pubDate> | ||
| 243 | <guid>https://mitjafelicijan.com/alacritty-open-links-with-modifier.html</guid> | ||
| 244 | <description>Alacritty by default makes all links in the terminal output clickable and thisgets annoying rather quickly.</description> | ||
| 245 | <content:encoded><p>Alacritty by default makes all links in the terminal output clickable and this | ||
| 246 | gets annoying rather quickly. I liked the default behavior of Gnome terminal | ||
| 247 | where you needed to hold Control key and then you could click and open links.</p> | ||
| 248 | <p>To achieve this in Alacritty you need to provide a <code>hint</code> in the configuration | ||
| 249 | file. Config file is located at <code>~/.config/alacritty/alacritty.yml</code>.</p> | ||
| 250 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span>hints: | ||
| 251 | </span></span><span style="display:flex;"><span> enabled: | ||
| 252 | </span></span><span style="display:flex;"><span> - regex: <span style="color:#a31515">&#34;(mailto:|gemini:|gopher:|https:|http:|news:|file:|git:|ssh:|ftp:)\ | ||
| 253 | </span></span></span><span style="display:flex;"><span><span style="color:#a31515"> [^\u0000-\u001F\u007F-\u009F&lt;&gt;\&#34;\\s{-}\\^⟨⟩`]+&#34;</span> | ||
| 254 | </span></span><span style="display:flex;"><span> command: xdg-open | ||
| 255 | </span></span><span style="display:flex;"><span> post_processing: <span style="color:#00f">true</span> | ||
| 256 | </span></span><span style="display:flex;"><span> mouse: | ||
| 257 | </span></span><span style="display:flex;"><span> enabled: <span style="color:#00f">true</span> | ||
| 258 | </span></span><span style="display:flex;"><span> mods: Control | ||
| 259 | </span></span></code></pre><p>The following should work under any Linux system. For macOS, you will need to | ||
| 260 | change <code>command: xdg-open</code> to something else.</p> | ||
| 261 | <p>Now the links will be visible and clickable only when Control key is being | ||
| 262 | pressed.</p> | ||
| 263 | <p>Source: <a href="https://github.com/alacritty/alacritty/issues/5246">https://github.com/alacritty/alacritty/issues/5246</a></p> | ||
| 264 | </content:encoded> | ||
| 265 | </item> | ||
| 266 | |||
| 267 | |||
| 268 | |||
| 269 | <item> | ||
| 270 | <title>Development environments with Nix</title> | ||
| 271 | <link>https://mitjafelicijan.com/development-environments-with-nix.html</link> | ||
| 272 | <pubDate>Sun, 25 Jun 2023 16:38:10 +0200</pubDate> | ||
| 273 | <guid>https://mitjafelicijan.com/development-environments-with-nix.html</guid> | ||
| 274 | <description>Nix is amazing for making reproducible cross OS development environment.</description> | ||
| 275 | <content:encoded><p>Nix is amazing for making reproducible cross OS development environment.</p> | ||
| 276 | <p>First you need to <a href="https://nixos.org/download.html">install Nix package | ||
| 277 | manager</a>.</p> | ||
| 278 | <ul> | ||
| 279 | <li>Create a file <code>shell.nix</code> in your project folder.</li> | ||
| 280 | <li>In the section that has <code>python3</code> etc add programs you want to use. These can | ||
| 281 | be CLI or GUI applications. It doesn't matter to Nix.</li> | ||
| 282 | </ul> | ||
| 283 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span>{ pkgs ? <span style="color:#00f">import</span> <span style="color:#a31515">&lt;nixpkgs&gt;</span> {} }: | ||
| 284 | </span></span><span style="display:flex;"><span> pkgs.mkShell { | ||
| 285 | </span></span><span style="display:flex;"><span> nativeBuildInputs = <span style="color:#00f">with</span> pkgs.buildPackages; [ | ||
| 286 | </span></span><span style="display:flex;"><span> python3 | ||
| 287 | </span></span><span style="display:flex;"><span> tinycc | ||
| 288 | </span></span><span style="display:flex;"><span> ]; | ||
| 289 | </span></span><span style="display:flex;"><span>} | ||
| 290 | </span></span></code></pre><p>And then run it <code>nix-shell</code>. By default it will look for <code>shell.nix</code> file. If | ||
| 291 | you want to specify a different file use <code>nix-shell file.nix</code>. That is about it.</p> | ||
| 292 | <p>When the shell is spawned it could happen that your <code>PS1</code> prompt will be | ||
| 293 | overwritten and your prompt will look differently. In that case you need to | ||
| 294 | either do <code>NIX_SHELL_PRESERVE_PROMPT=1 nix shell</code> or add | ||
| 295 | <code>NIX_SHELL_PRESERVE_PROMPT</code> variable to your <code>bashrc</code> or <code>zshrc</code> file and set it | ||
| 296 | to <code>1</code>.</p> | ||
| 297 | <p>I also have a modified <code>PS1</code> prompt for Bash that I use and it also catches the | ||
| 298 | usage of Nix shell.</p> | ||
| 299 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span>NIX_SHELL_PRESERVE_PROMPT=1 | ||
| 300 | </span></span><span style="display:flex;"><span> | ||
| 301 | </span></span><span style="display:flex;"><span>parse_git_branch() { | ||
| 302 | </span></span><span style="display:flex;"><span> git branch 2&gt; /dev/null | sed -e <span style="color:#a31515">&#39;/^[^*]/d&#39;</span> -e <span style="color:#a31515">&#39;s/* \(.*\)/ (\1)/&#39;</span> | ||
| 303 | </span></span><span style="display:flex;"><span>} | ||
| 304 | </span></span><span style="display:flex;"><span> | ||
| 305 | </span></span><span style="display:flex;"><span>is_inside_nix_shell() { | ||
| 306 | </span></span><span style="display:flex;"><span> nix_shell_name=<span style="color:#a31515">&#34;</span><span style="color:#00f">$(</span>basename <span style="color:#a31515">&#34;</span>$IN_NIX_SHELL<span style="color:#a31515">&#34;</span> 2&gt;/dev/null<span style="color:#00f">)</span><span style="color:#a31515">&#34;</span> | ||
| 307 | </span></span><span style="display:flex;"><span> <span style="color:#00f">if</span> [[ -n <span style="color:#a31515">&#34;</span>$nix_shell_name<span style="color:#a31515">&#34;</span> ]]; <span style="color:#00f">then</span> | ||
| 308 | </span></span><span style="display:flex;"><span> echo <span style="color:#a31515">&#34; \e[0;36m(nix-shell)\e[0m&#34;</span> | ||
| 309 | </span></span><span style="display:flex;"><span> <span style="color:#00f">fi</span> | ||
| 310 | </span></span><span style="display:flex;"><span>} | ||
| 311 | </span></span><span style="display:flex;"><span> | ||
| 312 | </span></span><span style="display:flex;"><span>export PS1=<span style="color:#a31515">&#34;[\033[38;5;9m\]\u@\h\[</span><span style="color:#00f">$(</span>tput sgr0<span style="color:#00f">)</span><span style="color:#a31515">\]]</span><span style="color:#00f">$(</span>is_inside_nix_shell<span style="color:#00f">)</span><span style="color:#a31515">\[\033[33m\]\$(parse_git_branch)\[\033[00m\] \w\[</span><span style="color:#00f">$(</span>tput sgr0<span style="color:#00f">)</span><span style="color:#a31515">\] \n</span>$<span style="color:#a31515"> &#34;</span> | ||
| 313 | </span></span></code></pre><p>And this is what it looks like when you are in a Nix shell. Otherwise that part | ||
| 314 | of prompt is omitted</p> | ||
| 315 | <figure> | ||
| 316 | <img src="/notes/ps1-prompt.png" alt="PS1 Prompt" /> | ||
| 317 | </figure> | ||
| 318 | <p>More resources:</p> | ||
| 319 | <ul> | ||
| 320 | <li><a href="https://nixos.wiki/wiki/Development_environment_with_nix-shell">https://nixos.wiki/wiki/Development_environment_with_nix-shell</a></li> | ||
| 321 | <li><a href="https://nixos.wiki/wiki/Main_Page">https://nixos.wiki/wiki/Main_Page</a></li> | ||
| 322 | <li><a href="https://itsfoss.com/why-use-nixos/">https://itsfoss.com/why-use-nixos/</a></li> | ||
| 323 | <li><a href="https://mynixos.com/">https://mynixos.com/</a></li> | ||
| 324 | </ul> | ||
| 325 | </content:encoded> | ||
| 326 | </item> | ||
| 327 | |||
| 328 | |||
| 329 | |||
| 330 | <item> | ||
| 331 | <title>Making cgit look nicer</title> | ||
| 332 | <link>https://mitjafelicijan.com/making-cgit-look-nicer.html</link> | ||
| 333 | <pubDate>Sat, 24 Jun 2023 13:33:58 +0200</pubDate> | ||
| 334 | <guid>https://mitjafelicijan.com/making-cgit-look-nicer.html</guid> | ||
| 335 | <description>For personal use I have a private Git serverset up and I use GitHub just as a mirror.</description> | ||
| 336 | <content:encoded><p>For personal use I have a <a href="https://git.mitjafelicijan.com">private Git server</a> | ||
| 337 | set up and I use GitHub just as a mirror. By default the cgit theme looks a bit | ||
| 338 | dated so I made the flowing theme.</p> | ||
| 339 | <ul> | ||
| 340 | <li><code>/etc/cgitrc</code></li> | ||
| 341 | </ul> | ||
| 342 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span>css=<span style="color:#a31515">/cgit.css</span> | ||
| 343 | </span></span><span style="display:flex;"><span>logo=<span style="color:#a31515">/startrek.gif</span> | ||
| 344 | </span></span><span style="display:flex;"><span>favicon=<span style="color:#a31515">/favicon.png</span> | ||
| 345 | </span></span><span style="display:flex;"><span>source-filter=<span style="color:#a31515">/usr/lib/cgit/filters/syntax-highlighting-edited.sh</span> | ||
| 346 | </span></span><span style="display:flex;"><span>about-filter=<span style="color:#a31515">/usr/lib/cgit/filters/about-formatting.sh</span> | ||
| 347 | </span></span><span style="display:flex;"><span> | ||
| 348 | </span></span><span style="display:flex;"><span>local-time=<span style="color:#a31515">1</span> | ||
| 349 | </span></span><span style="display:flex;"><span>snapshots=<span style="color:#a31515">tar.gz</span> | ||
| 350 | </span></span><span style="display:flex;"><span>repository-sort=<span style="color:#a31515">age</span> | ||
| 351 | </span></span><span style="display:flex;"><span>cache-size=<span style="color:#a31515">1000</span> | ||
| 352 | </span></span><span style="display:flex;"><span>branch-sort=<span style="color:#a31515">age</span> | ||
| 353 | </span></span><span style="display:flex;"><span>summary-log=<span style="color:#a31515">200</span> | ||
| 354 | </span></span><span style="display:flex;"><span>max-atom-items=<span style="color:#a31515">50</span> | ||
| 355 | </span></span><span style="display:flex;"><span>max-repo-count=<span style="color:#a31515">100</span> | ||
| 356 | </span></span><span style="display:flex;"><span> | ||
| 357 | </span></span><span style="display:flex;"><span>enable-index-owner=<span style="color:#a31515">0</span> | ||
| 358 | </span></span><span style="display:flex;"><span>enable-follow-links=<span style="color:#a31515">1</span> | ||
| 359 | </span></span><span style="display:flex;"><span>enable-log-filecount=<span style="color:#a31515">1</span> | ||
| 360 | </span></span><span style="display:flex;"><span>enable-log-linecount=<span style="color:#a31515">1</span> | ||
| 361 | </span></span><span style="display:flex;"><span> | ||
| 362 | </span></span><span style="display:flex;"><span>root-title=<span style="color:#a31515">Place for code, experiments and other bullshit!</span> | ||
| 363 | </span></span><span style="display:flex;"><span>root-desc= | ||
| 364 | </span></span><span style="display:flex;"><span>clone-url=<span style="color:#a31515">git@git.mitjafelicijan.com:/home/git/$CGIT_REPO_URL</span> | ||
| 365 | </span></span><span style="display:flex;"><span> | ||
| 366 | </span></span><span style="display:flex;"><span>mimetype.gif=<span style="color:#a31515">image/gif</span> | ||
| 367 | </span></span><span style="display:flex;"><span>mimetype.html=<span style="color:#a31515">text/html</span> | ||
| 368 | </span></span><span style="display:flex;"><span>mimetype.jpg=<span style="color:#a31515">image/jpeg</span> | ||
| 369 | </span></span><span style="display:flex;"><span>mimetype.jpeg=<span style="color:#a31515">image/jpeg</span> | ||
| 370 | </span></span><span style="display:flex;"><span>mimetype.pdf=<span style="color:#a31515">application/pdf</span> | ||
| 371 | </span></span><span style="display:flex;"><span>mimetype.png=<span style="color:#a31515">image/png</span> | ||
| 372 | </span></span><span style="display:flex;"><span>mimetype.svg=<span style="color:#a31515">image/svg+xml</span> | ||
| 373 | </span></span><span style="display:flex;"><span> | ||
| 374 | </span></span><span style="display:flex;"><span>readme=<span style="color:#a31515">:README.md</span> | ||
| 375 | </span></span><span style="display:flex;"><span>readme=<span style="color:#a31515">:readme.md</span> | ||
| 376 | </span></span><span style="display:flex;"><span> | ||
| 377 | </span></span><span style="display:flex;"><span><span style="color:#008000"># Must be at the end!</span> | ||
| 378 | </span></span><span style="display:flex;"><span>virtual-root=<span style="color:#a31515">/</span> | ||
| 379 | </span></span><span style="display:flex;"><span>scan-path=<span style="color:#a31515">/home/git/</span> | ||
| 380 | </span></span></code></pre><p>For <code>syntax-highlighting-edited.sh</code> follow instructions on | ||
| 381 | <a href="https://wiki.archlinux.org/title/Cgit#Using_highlight">https://wiki.archlinux.org/title/Cgit</a>.</p> | ||
| 382 | <ul> | ||
| 383 | <li><code>/usr/share/cgit/cgit.css</code></li> | ||
| 384 | </ul> | ||
| 385 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span>* { | ||
| 386 | </span></span><span style="display:flex;"><span> <span style="color:#00f">font-size</span>: 11<span style="color:#2b91af">pt</span>; | ||
| 387 | </span></span><span style="display:flex;"><span>} | ||
| 388 | </span></span><span style="display:flex;"><span> | ||
| 389 | </span></span><span style="display:flex;"><span>body { | ||
| 390 | </span></span><span style="display:flex;"><span> <span style="color:#00f">font-family</span>: <span style="color:#00f">monospace</span>; | ||
| 391 | </span></span><span style="display:flex;"><span> <span style="color:#00f">background</span>: <span style="color:#00f">white</span>; | ||
| 392 | </span></span><span style="display:flex;"><span> <span style="color:#00f">padding</span>: 1<span style="color:#2b91af">em</span>; | ||
| 393 | </span></span><span style="display:flex;"><span>} | ||
| 394 | </span></span><span style="display:flex;"><span> | ||
| 395 | </span></span><span style="display:flex;"><span>th, td { | ||
| 396 | </span></span><span style="display:flex;"><span> <span style="color:#00f">text-align</span>: <span style="color:#00f">left</span>; | ||
| 397 | </span></span><span style="display:flex;"><span>} | ||
| 398 | </span></span><span style="display:flex;"><span> | ||
| 399 | </span></span><span style="display:flex;"><span><span style="color:#008000">/* HEADER */</span> | ||
| 400 | </span></span><span style="display:flex;"><span> | ||
| 401 | </span></span><span style="display:flex;"><span>#header { | ||
| 402 | </span></span><span style="display:flex;"><span> <span style="color:#00f">margin-bottom</span>: 1<span style="color:#2b91af">em</span>; | ||
| 403 | </span></span><span style="display:flex;"><span>} | ||
| 404 | </span></span><span style="display:flex;"><span> | ||
| 405 | </span></span><span style="display:flex;"><span>#header .<span style="color:#2b91af">logo</span> img { | ||
| 406 | </span></span><span style="display:flex;"><span> <span style="color:#00f">display</span>: <span style="color:#00f">block</span>; | ||
| 407 | </span></span><span style="display:flex;"><span> <span style="color:#00f">height</span>: 3<span style="color:#2b91af">em</span>; | ||
| 408 | </span></span><span style="display:flex;"><span> <span style="color:#00f">margin-right</span>: 10<span style="color:#2b91af">px</span>; | ||
| 409 | </span></span><span style="display:flex;"><span>} | ||
| 410 | </span></span><span style="display:flex;"><span> | ||
| 411 | </span></span><span style="display:flex;"><span>#header .<span style="color:#2b91af">sub</span>.<span style="color:#2b91af">right</span> { | ||
| 412 | </span></span><span style="display:flex;"><span> <span style="color:#00f">display</span>: <span style="color:#00f">none</span>; | ||
| 413 | </span></span><span style="display:flex;"><span>} | ||
| 414 | </span></span><span style="display:flex;"><span> | ||
| 415 | </span></span><span style="display:flex;"><span><span style="color:#008000">/* FOOTER */</span> | ||
| 416 | </span></span><span style="display:flex;"><span> | ||
| 417 | </span></span><span style="display:flex;"><span>.<span style="color:#2b91af">footer</span> { | ||
| 418 | </span></span><span style="display:flex;"><span> <span style="color:#00f">margin-top</span>: 2<span style="color:#2b91af">em</span>; | ||
| 419 | </span></span><span style="display:flex;"><span> <span style="color:#00f">font-style</span>: <span style="color:#00f">italic</span>; | ||
| 420 | </span></span><span style="display:flex;"><span>} | ||
| 421 | </span></span><span style="display:flex;"><span> | ||
| 422 | </span></span><span style="display:flex;"><span>.<span style="color:#2b91af">footer</span>, .<span style="color:#2b91af">footer</span> a { | ||
| 423 | </span></span><span style="display:flex;"><span> <span style="color:#00f">color</span>: <span style="color:#00f">gray</span>; | ||
| 424 | </span></span><span style="display:flex;"><span>} | ||
| 425 | </span></span><span style="display:flex;"><span> | ||
| 426 | </span></span><span style="display:flex;"><span><span style="color:#008000">/* TABS */</span> | ||
| 427 | </span></span><span style="display:flex;"><span> | ||
| 428 | </span></span><span style="display:flex;"><span>.<span style="color:#2b91af">tabs</span> a { | ||
| 429 | </span></span><span style="display:flex;"><span> <span style="color:#00f">margin-bottom</span>: 2<span style="color:#2b91af">em</span>; | ||
| 430 | </span></span><span style="display:flex;"><span> <span style="color:#00f">display</span>: <span style="color:#00f">inline-block</span>; | ||
| 431 | </span></span><span style="display:flex;"><span> <span style="color:#00f">margin-right</span>: 1<span style="color:#2b91af">em</span>; | ||
| 432 | </span></span><span style="display:flex;"><span>} | ||
| 433 | </span></span><span style="display:flex;"><span> | ||
| 434 | </span></span><span style="display:flex;"><span>.<span style="color:#2b91af">tabs</span> td a:only-child { | ||
| 435 | </span></span><span style="display:flex;"><span> <span style="color:#00f">display</span>: <span style="color:#00f">none</span>; | ||
| 436 | </span></span><span style="display:flex;"><span>} | ||
| 437 | </span></span><span style="display:flex;"><span> | ||
| 438 | </span></span><span style="display:flex;"><span><span style="color:#008000">/* HIDING ELEMENTS */</span> | ||
| 439 | </span></span><span style="display:flex;"><span> | ||
| 440 | </span></span><span style="display:flex;"><span>.<span style="color:#2b91af">cgit-panel</span>, .<span style="color:#2b91af">form</span> { | ||
| 441 | </span></span><span style="display:flex;"><span> <span style="color:#00f">display</span>: <span style="color:#00f">none</span>; | ||
| 442 | </span></span><span style="display:flex;"><span>} | ||
| 443 | </span></span><span style="display:flex;"><span> | ||
| 444 | </span></span><span style="display:flex;"><span><span style="color:#008000">/* LISTS */</span> | ||
| 445 | </span></span><span style="display:flex;"><span> | ||
| 446 | </span></span><span style="display:flex;"><span>.<span style="color:#2b91af">list</span> td, .<span style="color:#2b91af">list</span> th { | ||
| 447 | </span></span><span style="display:flex;"><span> <span style="color:#00f">padding-right</span>: 2<span style="color:#2b91af">em</span>; | ||
| 448 | </span></span><span style="display:flex;"><span>} | ||
| 449 | </span></span><span style="display:flex;"><span> | ||
| 450 | </span></span><span style="display:flex;"><span>.<span style="color:#2b91af">list</span> .<span style="color:#2b91af">nohover</span> a { | ||
| 451 | </span></span><span style="display:flex;"><span> <span style="color:#00f">color</span>: <span style="color:#00f">black</span>; | ||
| 452 | </span></span><span style="display:flex;"><span>} | ||
| 453 | </span></span><span style="display:flex;"><span> | ||
| 454 | </span></span><span style="display:flex;"><span>.<span style="color:#2b91af">list</span> .<span style="color:#2b91af">button</span> { | ||
| 455 | </span></span><span style="display:flex;"><span> <span style="color:#00f">padding-right</span>: 0.5<span style="color:#2b91af">em</span>; | ||
| 456 | </span></span><span style="display:flex;"><span>} | ||
| 457 | </span></span><span style="display:flex;"><span> | ||
| 458 | </span></span><span style="display:flex;"><span><span style="color:#008000">/* COMMIT */</span> | ||
| 459 | </span></span><span style="display:flex;"><span> | ||
| 460 | </span></span><span style="display:flex;"><span>.<span style="color:#2b91af">commit-subject</span> { | ||
| 461 | </span></span><span style="display:flex;"><span> <span style="color:#00f">padding</span>: 1<span style="color:#2b91af">em</span> 0; | ||
| 462 | </span></span><span style="display:flex;"><span>} | ||
| 463 | </span></span><span style="display:flex;"><span> | ||
| 464 | </span></span><span style="display:flex;"><span>.<span style="color:#2b91af">decoration</span> a { | ||
| 465 | </span></span><span style="display:flex;"><span> <span style="color:#00f">padding-left</span>: 0.5<span style="color:#2b91af">em</span>; | ||
| 466 | </span></span><span style="display:flex;"><span>} | ||
| 467 | </span></span><span style="display:flex;"><span> | ||
| 468 | </span></span><span style="display:flex;"><span>.<span style="color:#2b91af">commit-info</span> th { | ||
| 469 | </span></span><span style="display:flex;"><span> <span style="color:#00f">padding-right</span>: 1<span style="color:#2b91af">em</span>; | ||
| 470 | </span></span><span style="display:flex;"><span>} | ||
| 471 | </span></span><span style="display:flex;"><span> | ||
| 472 | </span></span><span style="display:flex;"><span>.<span style="color:#2b91af">commit-subject</span> { | ||
| 473 | </span></span><span style="display:flex;"><span> <span style="color:#00f">padding</span>: 2<span style="color:#2b91af">em</span> 0; | ||
| 474 | </span></span><span style="display:flex;"><span>} | ||
| 475 | </span></span><span style="display:flex;"><span> | ||
| 476 | </span></span><span style="display:flex;"><span>table.<span style="color:#2b91af">diff</span> div.<span style="color:#2b91af">head</span> { | ||
| 477 | </span></span><span style="display:flex;"><span> <span style="color:#00f">padding-top</span>: 2<span style="color:#2b91af">em</span>; | ||
| 478 | </span></span><span style="display:flex;"><span>} | ||
| 479 | </span></span><span style="display:flex;"><span> | ||
| 480 | </span></span><span style="display:flex;"><span>table.<span style="color:#2b91af">diffstat</span> td { | ||
| 481 | </span></span><span style="display:flex;"><span> <span style="color:#00f">padding-right</span>: 1<span style="color:#2b91af">em</span>; | ||
| 482 | </span></span><span style="display:flex;"><span>} | ||
| 483 | </span></span><span style="display:flex;"><span> | ||
| 484 | </span></span><span style="display:flex;"><span><span style="color:#008000">/* CONTENT */</span> | ||
| 485 | </span></span><span style="display:flex;"><span> | ||
| 486 | </span></span><span style="display:flex;"><span>.<span style="color:#2b91af">linenumbers</span> { | ||
| 487 | </span></span><span style="display:flex;"><span> <span style="color:#00f">padding-right</span>: 0.5<span style="color:#2b91af">em</span>; | ||
| 488 | </span></span><span style="display:flex;"><span>} | ||
| 489 | </span></span><span style="display:flex;"><span> | ||
| 490 | </span></span><span style="display:flex;"><span>.<span style="color:#2b91af">linenumbers</span> a { | ||
| 491 | </span></span><span style="display:flex;"><span> <span style="color:#00f">color</span>: <span style="color:#00f">gray</span>; | ||
| 492 | </span></span><span style="display:flex;"><span>} | ||
| 493 | </span></span><span style="display:flex;"><span> | ||
| 494 | </span></span><span style="display:flex;"><span>.<span style="color:#2b91af">pager</span> { | ||
| 495 | </span></span><span style="display:flex;"><span> <span style="color:#00f">display</span>: <span style="color:#00f">flex</span>; | ||
| 496 | </span></span><span style="display:flex;"><span> <span style="color:#00f">list-style-type</span>: <span style="color:#00f">none</span>; | ||
| 497 | </span></span><span style="display:flex;"><span> <span style="color:#00f">padding</span>: 0; | ||
| 498 | </span></span><span style="display:flex;"><span> gap: 0.5<span style="color:#2b91af">em</span>; | ||
| 499 | </span></span><span style="display:flex;"><span>} | ||
| 500 | </span></span><span style="display:flex;"><span> | ||
| 501 | </span></span><span style="display:flex;"><span><span style="color:#008000">/* DIFF COLORS */</span> | ||
| 502 | </span></span><span style="display:flex;"><span> | ||
| 503 | </span></span><span style="display:flex;"><span>table.<span style="color:#2b91af">diff</span> { | ||
| 504 | </span></span><span style="display:flex;"><span> <span style="color:#00f">width</span>: 100<span style="color:#2b91af">%</span>; | ||
| 505 | </span></span><span style="display:flex;"><span>} | ||
| 506 | </span></span><span style="display:flex;"><span> | ||
| 507 | </span></span><span style="display:flex;"><span>table.<span style="color:#2b91af">diff</span> td { | ||
| 508 | </span></span><span style="display:flex;"><span> <span style="color:#00f">white-space</span>: <span style="color:#00f">pre</span>; | ||
| 509 | </span></span><span style="display:flex;"><span>} | ||
| 510 | </span></span><span style="display:flex;"><span> | ||
| 511 | </span></span><span style="display:flex;"><span>table.<span style="color:#2b91af">diff</span> td div.<span style="color:#2b91af">head</span> { | ||
| 512 | </span></span><span style="display:flex;"><span> <span style="color:#00f">font-weight</span>: <span style="color:#00f">bold</span>; | ||
| 513 | </span></span><span style="display:flex;"><span> <span style="color:#00f">margin-top</span>: 1<span style="color:#2b91af">em</span>; | ||
| 514 | </span></span><span style="display:flex;"><span> <span style="color:#00f">color</span>: <span style="color:#00f">black</span>; | ||
| 515 | </span></span><span style="display:flex;"><span>} | ||
| 516 | </span></span><span style="display:flex;"><span> | ||
| 517 | </span></span><span style="display:flex;"><span>table.<span style="color:#2b91af">diff</span> td div.<span style="color:#2b91af">hunk</span> { | ||
| 518 | </span></span><span style="display:flex;"><span> <span style="color:#00f">color</span>: #009; | ||
| 519 | </span></span><span style="display:flex;"><span>} | ||
| 520 | </span></span><span style="display:flex;"><span> | ||
| 521 | </span></span><span style="display:flex;"><span>table.<span style="color:#2b91af">diff</span> td div.<span style="color:#2b91af">add</span> { | ||
| 522 | </span></span><span style="display:flex;"><span> <span style="color:#00f">color</span>: <span style="color:#00f">green</span>; | ||
| 523 | </span></span><span style="display:flex;"><span>} | ||
| 524 | </span></span><span style="display:flex;"><span> | ||
| 525 | </span></span><span style="display:flex;"><span>table.<span style="color:#2b91af">diff</span> td div.<span style="color:#2b91af">del</span> { | ||
| 526 | </span></span><span style="display:flex;"><span> <span style="color:#00f">color</span>: <span style="color:#00f">red</span>; | ||
| 527 | </span></span><span style="display:flex;"><span>} | ||
| 528 | </span></span></code></pre></content:encoded> | ||
| 529 | </item> | ||
| 530 | |||
| 531 | |||
| 532 | |||
| 533 | <item> | ||
| 534 | <title>Simple presentations with Markdown</title> | ||
| 535 | <link>https://mitjafelicijan.com/presentations-with-markdown.html</link> | ||
| 536 | <pubDate>Wed, 21 Jun 2023 08:54:48 +0200</pubDate> | ||
| 537 | <guid>https://mitjafelicijan.com/presentations-with-markdown.html</guid> | ||
| 538 | <description>A simple way to make presentations without using desktop apps or using onlineservices is https://github.</description> | ||
| 539 | <content:encoded><p>A simple way to make presentations without using desktop apps or using online | ||
| 540 | services is <a href="https://github.com/remarkjs/remark">https://github.com/remarkjs/remark</a>.</p> | ||
| 541 | <p>First create <code>index.html</code> and be sure you make changes to <code>config</code> variable.</p> | ||
| 542 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span><span style="color:#00f">&lt;!DOCTYPE html&gt;</span> | ||
| 543 | </span></span><span style="display:flex;"><span>&lt;html&gt; | ||
| 544 | </span></span><span style="display:flex;"><span> | ||
| 545 | </span></span><span style="display:flex;"><span>&lt;head&gt; | ||
| 546 | </span></span><span style="display:flex;"><span> &lt;title&gt;&lt;/title&gt; | ||
| 547 | </span></span><span style="display:flex;"><span> &lt;meta charset=<span style="color:#a31515">&#34;utf-8&#34;</span>&gt; | ||
| 548 | </span></span><span style="display:flex;"><span> &lt;style&gt; | ||
| 549 | </span></span><span style="display:flex;"><span> body { | ||
| 550 | </span></span><span style="display:flex;"><span> <span style="color:#00f">font-family</span>: <span style="color:#a31515">&#39;SF Pro Display&#39;</span>; | ||
| 551 | </span></span><span style="display:flex;"><span> } | ||
| 552 | </span></span><span style="display:flex;"><span> | ||
| 553 | </span></span><span style="display:flex;"><span> .<span style="color:#2b91af">remark-code</span>, | ||
| 554 | </span></span><span style="display:flex;"><span> .<span style="color:#2b91af">remark-inline-code</span> { | ||
| 555 | </span></span><span style="display:flex;"><span> <span style="color:#00f">font-family</span>: <span style="color:#a31515">&#39;SF Mono&#39;</span>; | ||
| 556 | </span></span><span style="display:flex;"><span> <span style="color:#00f">font-size</span>: <span style="color:#00f">medium</span>; | ||
| 557 | </span></span><span style="display:flex;"><span> <span style="color:#00f">background-color</span>: <span style="color:#00f">gainsboro</span>; | ||
| 558 | </span></span><span style="display:flex;"><span> <span style="color:#00f">border-radius</span>: 5<span style="color:#2b91af">px</span>; | ||
| 559 | </span></span><span style="display:flex;"><span> <span style="color:#00f">padding</span>: 0 5<span style="color:#2b91af">px</span>; | ||
| 560 | </span></span><span style="display:flex;"><span> } | ||
| 561 | </span></span><span style="display:flex;"><span> &lt;/style&gt; | ||
| 562 | </span></span><span style="display:flex;"><span>&lt;/head&gt; | ||
| 563 | </span></span><span style="display:flex;"><span> | ||
| 564 | </span></span><span style="display:flex;"><span>&lt;body&gt; | ||
| 565 | </span></span><span style="display:flex;"><span> &lt;textarea id=<span style="color:#a31515">&#34;source&#34;</span>&gt;&lt;/textarea&gt; | ||
| 566 | </span></span><span style="display:flex;"><span> &lt;script src=<span style="color:#a31515">&#34;https://remarkjs.com/downloads/remark-latest.min.js&#34;</span>&gt;&lt;/script&gt; | ||
| 567 | </span></span><span style="display:flex;"><span> &lt;script&gt; | ||
| 568 | </span></span><span style="display:flex;"><span> <span style="color:#00f">const</span> config = { | ||
| 569 | </span></span><span style="display:flex;"><span> title: <span style="color:#a31515">&#39;My presentation&#39;</span>, | ||
| 570 | </span></span><span style="display:flex;"><span> file: <span style="color:#a31515">&#39;presentation.md&#39;</span>, | ||
| 571 | </span></span><span style="display:flex;"><span> }; | ||
| 572 | </span></span><span style="display:flex;"><span> | ||
| 573 | </span></span><span style="display:flex;"><span> document.title = config.title; | ||
| 574 | </span></span><span style="display:flex;"><span> remark.create({ sourceUrl: config.file }); | ||
| 575 | </span></span><span style="display:flex;"><span> &lt;/script&gt; | ||
| 576 | </span></span><span style="display:flex;"><span>&lt;/body&gt; | ||
| 577 | </span></span><span style="display:flex;"><span> | ||
| 578 | </span></span><span style="display:flex;"><span>&lt;/html&gt; | ||
| 579 | </span></span></code></pre><p>Now the markdown file <code>presentation.md</code> with presenetation. <code>---</code> is used to | ||
| 580 | separate slides. Other stuff is just pure markdown.</p> | ||
| 581 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span>class: center, middle | ||
| 582 | </span></span><span style="display:flex;"><span> | ||
| 583 | </span></span><span style="display:flex;"><span><span style="font-weight:bold"># Main title of the presentation | ||
| 584 | </span></span></span><span style="display:flex;"><span><span style="font-weight:bold"></span> | ||
| 585 | </span></span><span style="display:flex;"><span>--- | ||
| 586 | </span></span><span style="display:flex;"><span> | ||
| 587 | </span></span><span style="display:flex;"><span><span style="font-weight:bold"># Fist slide | ||
| 588 | </span></span></span><span style="display:flex;"><span><span style="font-weight:bold"></span> | ||
| 589 | </span></span><span style="display:flex;"><span>Eveniet mollitia nemo architecto rerum aut iure iste. Sit nihil nobis libero iusto fugit nam laudantium ut. Dignissimos corrupti laudantium nisi. | ||
| 590 | </span></span><span style="display:flex;"><span> | ||
| 591 | </span></span><span style="display:flex;"><span><span style="color:#00f">-</span> Lorem ipsum dolor sit amet, consectetur adipiscing elit. | ||
| 592 | </span></span><span style="display:flex;"><span><span style="color:#00f">-</span> Integer aliquet mauris a felis fringilla, ut congue massa finibus. | ||
| 593 | </span></span><span style="display:flex;"><span> | ||
| 594 | </span></span><span style="display:flex;"><span>--- | ||
| 595 | </span></span><span style="display:flex;"><span> | ||
| 596 | </span></span><span style="display:flex;"><span><span style="font-weight:bold"># Slide two | ||
| 597 | </span></span></span><span style="display:flex;"><span><span style="font-weight:bold"></span> | ||
| 598 | </span></span><span style="display:flex;"><span><span style="color:#00f">-</span> Lorem ipsum dolor sit amet, consectetur adipiscing elit. | ||
| 599 | </span></span><span style="display:flex;"><span><span style="color:#00f">-</span> Vestibulum eget leo ac dolor venenatis pulvinar. | ||
| 600 | </span></span></code></pre></content:encoded> | ||
| 601 | </item> | ||
| 602 | |||
| 603 | |||
| 604 | |||
| 605 | <item> | ||
| 606 | <title>Bulk thumbnails</title> | ||
| 607 | <link>https://mitjafelicijan.com/bulk-make-thumbnails.html</link> | ||
| 608 | <pubDate>Sun, 04 Jun 2023 20:46:56 +0200</pubDate> | ||
| 609 | <guid>https://mitjafelicijan.com/bulk-make-thumbnails.html</guid> | ||
| 610 | <description>Make bulk thumbnails of JPGs with ImageMagick.</description> | ||
| 611 | <content:encoded><p>Make bulk thumbnails of JPGs with ImageMagick.</p> | ||
| 612 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span><span style="color:#00f">#!/bin/bash | ||
| 613 | </span></span></span><span style="display:flex;"><span><span style="color:#00f"></span> | ||
| 614 | </span></span><span style="display:flex;"><span>directory=<span style="color:#a31515">&#34;./images/&#34;</span> | ||
| 615 | </span></span><span style="display:flex;"><span>dimensions=<span style="color:#a31515">&#34;360x360&#34;</span> | ||
| 616 | </span></span><span style="display:flex;"><span> | ||
| 617 | </span></span><span style="display:flex;"><span><span style="color:#00f">for</span> file in <span style="color:#a31515">&#34;</span>$directory<span style="color:#a31515">&#34;</span>*.jpg; <span style="color:#00f">do</span> | ||
| 618 | </span></span><span style="display:flex;"><span> convert <span style="color:#a31515">&#34;</span>$file<span style="color:#a31515">&#34;</span> -resize $dimensions <span style="color:#a31515">&#34;</span>$file<span style="color:#a31515">&#34;</span> <span style="color:#a31515">&#34;</span><span style="color:#a31515">${</span>file%.*<span style="color:#a31515">}</span><span style="color:#a31515">-thumbnail.jpg&#34;</span> | ||
| 619 | </span></span><span style="display:flex;"><span><span style="color:#00f">done</span> | ||
| 620 | </span></span></code></pre></content:encoded> | ||
| 621 | </item> | ||
| 622 | |||
| 623 | |||
| 624 | |||
| 625 | <item> | ||
| 626 | <title>Edsger W. Dijkstra Manuscripts ebook</title> | ||
| 627 | <link>https://mitjafelicijan.com/ewd-manuscripts-ebook.html</link> | ||
| 628 | <pubDate>Thu, 01 Jun 2023 22:47:56 +0200</pubDate> | ||
| 629 | <guid>https://mitjafelicijan.com/ewd-manuscripts-ebook.html</guid> | ||
| 630 | <description>I love reading the original manuscripts of Edsger W.</description> | ||
| 631 | <content:encoded><p>I love reading the original manuscripts of Edsger W. Dijkstra. They are | ||
| 632 | available online at the University of Texas at Austin website, but I also found | ||
| 633 | MOBI version. I converted it into ePub as well.</p> | ||
| 634 | <p>Downloads:</p> | ||
| 635 | <ul> | ||
| 636 | <li><a href="https://mitjafelicijan.fra1.digitaloceanspaces.com/haphazard/ewd-manuscripts.mobi">MOBI version of all Manuscripts</a></li> | ||
| 637 | <li><a href="https://mitjafelicijan.fra1.digitaloceanspaces.com/haphazard/ewd-manuscripts.epub">ePub version of all Manuscripts</a></li> | ||
| 638 | </ul> | ||
| 639 | <p>Sources and credits:</p> | ||
| 640 | <ul> | ||
| 641 | <li><a href="https://www.cs.utexas.edu/users/EWD/index00xx.html">Original manuscripts from University of Texas at Austin</a></li> | ||
| 642 | <li><a href="https://github.com/evmn/The-Manuscripts-of-Edsger-W.-Dijkstra">Original repository of MOBI version</a></li> | ||
| 643 | </ul> | ||
| 644 | </content:encoded> | ||
| 645 | </item> | ||
| 646 | |||
| 647 | |||
| 648 | |||
| 649 | |||
| 650 | |||
| 651 | <item> | ||
| 652 | <title>Extending dte editor</title> | ||
| 653 | <link>https://mitjafelicijan.com/extending-dte-editor.html</link> | ||
| 654 | <pubDate>Wed, 31 May 2023 08:12:45 +0200</pubDate> | ||
| 655 | <guid>https://mitjafelicijan.com/extending-dte-editor.html</guid> | ||
| 656 | <description>dte is an interesting editor I startedusing lately more and more.</description> | ||
| 657 | <content:encoded><p><a href="https://craigbarnes.gitlab.io/dte/"><code>dte</code></a> is an interesting editor I started | ||
| 658 | using lately more and more. Since it is using | ||
| 659 | <a href="https://linux.die.net/man/3/execvp"><code>execvp()</code></a> it can be easily extended. I | ||
| 660 | needed comment/uncomment feature so I created a small utility that does this for | ||
| 661 | me. Code lives on repository <a href="https://git.mitjafelicijan.com/dte-extensions.git/about/">dte | ||
| 662 | extensions</a> but this | ||
| 663 | utilities can be used for whatever you want. Make sure you have version 1.11 or | ||
| 664 | above.</p> | ||
| 665 | <p>Next one will be invoking formatter based on the type of a file.</p> | ||
| 666 | <p>My config that works for me.</p> | ||
| 667 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span>set show-line-numbers true; | ||
| 668 | </span></span><span style="display:flex;"><span>set tab-width 4; | ||
| 669 | </span></span><span style="display:flex;"><span>set <span style="color:#00f">case</span>-sensitive-search false; | ||
| 670 | </span></span><span style="display:flex;"><span> | ||
| 671 | </span></span><span style="display:flex;"><span><span style="color:#008000"># Special aliases</span> | ||
| 672 | </span></span><span style="display:flex;"><span>alias m_comment <span style="color:#a31515">&#39;exec -s -i line -o buffer -e errmsg ~/.dte/bin/comment&#39;</span> | ||
| 673 | </span></span><span style="display:flex;"><span>alias m_format <span style="color:#a31515">&#39;save; exec go fmt .; reload&#39;</span> | ||
| 674 | </span></span><span style="display:flex;"><span>alias m_duplicate <span style="color:#a31515">&#39;copy;paste&#39;</span>; | ||
| 675 | </span></span><span style="display:flex;"><span> | ||
| 676 | </span></span><span style="display:flex;"><span><span style="color:#008000"># Useful aliases.</span> | ||
| 677 | </span></span><span style="display:flex;"><span>alias m_force_close <span style="color:#a31515">&#39;quit -f&#39;</span>; | ||
| 678 | </span></span><span style="display:flex;"><span>alias m_reload <span style="color:#a31515">&#39;close; open $FILE&#39;</span> | ||
| 679 | </span></span><span style="display:flex;"><span> | ||
| 680 | </span></span><span style="display:flex;"><span><span style="color:#008000"># Key bindings.</span> | ||
| 681 | </span></span><span style="display:flex;"><span>bind M-s save; | ||
| 682 | </span></span><span style="display:flex;"><span>bind M-q m_force_close; | ||
| 683 | </span></span><span style="display:flex;"><span>bind M-z refresh; | ||
| 684 | </span></span><span style="display:flex;"><span>bind C-down blkdown; | ||
| 685 | </span></span><span style="display:flex;"><span>bind C-up blkup; | ||
| 686 | </span></span><span style="display:flex;"><span>bind C-_ m_comment; | ||
| 687 | </span></span><span style="display:flex;"><span>bind M-. m_format; | ||
| 688 | </span></span><span style="display:flex;"><span>bind C-d m_duplicate; | ||
| 689 | </span></span><span style="display:flex;"><span> | ||
| 690 | </span></span><span style="display:flex;"><span><span style="color:#008000"># Syntax highlighting.</span> | ||
| 691 | </span></span><span style="display:flex;"><span>hi preproc magenta; | ||
| 692 | </span></span><span style="display:flex;"><span>hi keyword red; | ||
| 693 | </span></span><span style="display:flex;"><span>hi linenumber blue; | ||
| 694 | </span></span><span style="display:flex;"><span>hi comment cyan; | ||
| 695 | </span></span></code></pre></content:encoded> | ||
| 696 | </item> | ||
| 697 | |||
| 698 | |||
| 699 | |||
| 700 | <item> | ||
| 701 | <title>Grep to Less that maintain colors</title> | ||
| 702 | <link>https://mitjafelicijan.com/grep-to-less-maintain-colors.html</link> | ||
| 703 | <pubDate>Mon, 29 May 2023 21:27:07 +0200</pubDate> | ||
| 704 | <guid>https://mitjafelicijan.com/grep-to-less-maintain-colors.html</guid> | ||
| 705 | <description>I often use grep to search for todo&#39;s in my code and other people&#39;s code andthen pipe them in less and I missed having colors that grep outputs in less.</description> | ||
| 706 | <content:encoded><p>I often use <code>grep</code> to search for todo's in my code and other people's code and | ||
| 707 | then pipe them in <code>less</code> and I missed having colors that grep outputs in <code>less</code>.</p> | ||
| 708 | <ul> | ||
| 709 | <li>Grep's <code>--color=always</code> use markers to highlight the matching strings.</li> | ||
| 710 | <li>Less's <code>-R</code> option outputs &quot;raw&quot; control characters.</li> | ||
| 711 | </ul> | ||
| 712 | <p>You could use <code>alias grep='grep --color=always'</code> and <code>alias less='less -R'</code> or | ||
| 713 | create todo function in your <code>.bashrc</code> that accepts first argument as search | ||
| 714 | string.</p> | ||
| 715 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span><span style="color:#008000"># This is where the magic happens.</span> | ||
| 716 | </span></span><span style="display:flex;"><span>grep --color=always -rni <span style="color:#a31515">&#34;TODO:&#34;</span> | less -R | ||
| 717 | </span></span></code></pre><figure> | ||
| 718 | <img src="/notes/grep-less.png" alt="Less and grep" /> | ||
| 719 | </figure> | ||
| 720 | </content:encoded> | ||
| 721 | </item> | ||
| 722 | |||
| 723 | |||
| 724 | |||
| 725 | <item> | ||
| 726 | <title>Easy measure time took in a bash script</title> | ||
| 727 | <link>https://mitjafelicijan.com/easy-time-took-in-bash.html</link> | ||
| 728 | <pubDate>Sun, 28 May 2023 17:53:20 +0200</pubDate> | ||
| 729 | <guid>https://mitjafelicijan.com/easy-time-took-in-bash.html</guid> | ||
| 730 | <description>In Bash, the $SECONDS variable is a special variable that automatically keepstrack of the number of seconds since the current shell or script startedexecuting.</description> | ||
| 731 | <content:encoded><p>In Bash, the <code>$SECONDS</code> variable is a special variable that automatically keeps | ||
| 732 | track of the number of seconds since the current shell or script started | ||
| 733 | executing. It starts counting from the moment the script begins running.</p> | ||
| 734 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span><span style="color:#00f">#!/bin/bash | ||
| 735 | </span></span></span><span style="display:flex;"><span><span style="color:#00f"></span> | ||
| 736 | </span></span><span style="display:flex;"><span><span style="color:#008000"># Reset the timer to zero.</span> | ||
| 737 | </span></span><span style="display:flex;"><span>SECONDS=0 | ||
| 738 | </span></span><span style="display:flex;"><span> | ||
| 739 | </span></span><span style="display:flex;"><span><span style="color:#008000"># Do something.</span> | ||
| 740 | </span></span><span style="display:flex;"><span>sleep 5 | ||
| 741 | </span></span><span style="display:flex;"><span> | ||
| 742 | </span></span><span style="display:flex;"><span><span style="color:#008000"># Print the time elapsed.</span> | ||
| 743 | </span></span><span style="display:flex;"><span>echo <span style="color:#a31515">&#34;Time taken: </span>$SECONDS<span style="color:#a31515"> seconds&#34;</span> | ||
| 744 | </span></span></code></pre></content:encoded> | ||
| 745 | </item> | ||
| 746 | |||
| 747 | |||
| 748 | |||
| 749 | <item> | ||
| 750 | <title>Make DCSS playable on 4k displays</title> | ||
| 751 | <link>https://mitjafelicijan.com/dcss-on-4k-display.html</link> | ||
| 752 | <pubDate>Sat, 27 May 2023 19:35:11 +0200</pubDate> | ||
| 753 | <guid>https://mitjafelicijan.com/dcss-on-4k-display.html</guid> | ||
| 754 | <description>Dungeon Crawl Stone Soup has a a very small font by default.</description> | ||
| 755 | <content:encoded><p>Dungeon Crawl Stone Soup has a a very small font by default. On a 4k display, it | ||
| 756 | is barely readable. This is how I made it playable.</p> | ||
| 757 | <p>Make a file <code>~/.crawlrc</code> with the following content:</p> | ||
| 758 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span><span style="color:#008000"># Adjust the sizes to your liking.</span> | ||
| 759 | </span></span><span style="display:flex;"><span> | ||
| 760 | </span></span><span style="display:flex;"><span>tile_font_crt_size = <span style="color:#a31515">32</span> | ||
| 761 | </span></span><span style="display:flex;"><span>tile_font_stat_size = <span style="color:#a31515">32</span> | ||
| 762 | </span></span><span style="display:flex;"><span>tile_font_msg_size = <span style="color:#a31515">32</span> | ||
| 763 | </span></span><span style="display:flex;"><span>tile_font_tip_size = <span style="color:#a31515">32</span> | ||
| 764 | </span></span><span style="display:flex;"><span>tile_font_lbl_size = <span style="color:#a31515">32</span> | ||
| 765 | </span></span><span style="display:flex;"><span>tile_sidebar_pixels = <span style="color:#a31515">64</span> | ||
| 766 | </span></span></code></pre><p>To zoom in and out in viewport, press <code>Ctrl+</code> and <code>Ctrl-</code> respectively.</p> | ||
| 767 | <p>All the possible options are documented in the <a href="https://github.com/crawl/crawl/blob/master/crawl-ref/docs/options_guide.txt">Dungeon Crawl Stone Soup Options | ||
| 768 | Guide</a> | ||
| 769 | file.</p> | ||
| 770 | </content:encoded> | ||
| 771 | </item> | ||
| 772 | |||
| 773 | |||
| 774 | |||
| 775 | <item> | ||
| 776 | <title>Drawing Pixels in Plan9</title> | ||
| 777 | <link>https://mitjafelicijan.com/drawing-pixels-in-plan9.html</link> | ||
| 778 | <pubDate>Sat, 27 May 2023 17:41:33 +0200</pubDate> | ||
| 779 | <guid>https://mitjafelicijan.com/drawing-pixels-in-plan9.html</guid> | ||
| 780 | <description>I have started exploring Plan9&#39;s graphics capabilities.</description> | ||
| 781 | <content:encoded><p>I have started exploring Plan9's graphics capabilities. This is a hello world | ||
| 782 | alternative for drawing that draws a yellow square on a blue background.</p> | ||
| 783 | <p>More information:</p> | ||
| 784 | <ul> | ||
| 785 | <li><a href="https://github.com/0intro/plan9/blob/main/sys/include/draw.h">draw.h header file</a> | ||
| 786 | contains all the drawing functions</li> | ||
| 787 | <li><a href="https://9fans.github.io/plan9port/man/man3/draw.html">draw man page</a> | ||
| 788 | has a bit more digestable descriptions of the draw functions</li> | ||
| 789 | <li><a href="https://9fans.github.io/plan9port/man/man3/graphics.html">graphics man page</a> | ||
| 790 | has a bit more digestable descriptions of the graphics functions</li> | ||
| 791 | <li><a href="https://9fans.github.io/plan9port/man/man3/">all man pages</a> | ||
| 792 | can be a valuable resource for learning about the system</li> | ||
| 793 | </ul> | ||
| 794 | <figure> | ||
| 795 | <img src="/notes/plan9-pixels.png" alt="Plan9 Howdy World!" /> | ||
| 796 | </figure> | ||
| 797 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span><span style="color:#008000">// main.c | ||
| 798 | </span></span></span><span style="display:flex;"><span><span style="color:#008000"></span><span style="color:#00f">#include</span> <span style="color:#00f">&lt;u.h&gt;</span><span style="color:#00f"> | ||
| 799 | </span></span></span><span style="display:flex;"><span><span style="color:#00f">#include</span> <span style="color:#00f">&lt;libc.h&gt;</span><span style="color:#00f"> | ||
| 800 | </span></span></span><span style="display:flex;"><span><span style="color:#00f">#include</span> <span style="color:#00f">&lt;draw.h&gt;</span><span style="color:#00f"> | ||
| 801 | </span></span></span><span style="display:flex;"><span><span style="color:#00f">#include</span> <span style="color:#00f">&lt;cursor.h&gt;</span><span style="color:#00f"> | ||
| 802 | </span></span></span><span style="display:flex;"><span><span style="color:#00f"></span> | ||
| 803 | </span></span><span style="display:flex;"><span><span style="color:#2b91af">void</span> | ||
| 804 | </span></span><span style="display:flex;"><span>main() | ||
| 805 | </span></span><span style="display:flex;"><span>{ | ||
| 806 | </span></span><span style="display:flex;"><span> ulong co; | ||
| 807 | </span></span><span style="display:flex;"><span> Image *im, *bg; | ||
| 808 | </span></span><span style="display:flex;"><span> co = 0x0000FFFF; | ||
| 809 | </span></span><span style="display:flex;"><span> | ||
| 810 | </span></span><span style="display:flex;"><span> <span style="color:#00f">if</span> (initdraw(nil, nil, argv0) &lt; 0) | ||
| 811 | </span></span><span style="display:flex;"><span> { | ||
| 812 | </span></span><span style="display:flex;"><span> sysfatal(<span style="color:#a31515">&#34;%s: %r&#34;</span>, argv0); | ||
| 813 | </span></span><span style="display:flex;"><span> } | ||
| 814 | </span></span><span style="display:flex;"><span> | ||
| 815 | </span></span><span style="display:flex;"><span> im = allocimage(display, Rect(0, 0, 300, 300), RGB24, 0, DYellow); | ||
| 816 | </span></span><span style="display:flex;"><span> bg = allocimage(display, Rect(0, 0, 1, 1), RGB24, 1, co); | ||
| 817 | </span></span><span style="display:flex;"><span> | ||
| 818 | </span></span><span style="display:flex;"><span> <span style="color:#00f">if</span> (im == nil || bg == nil) | ||
| 819 | </span></span><span style="display:flex;"><span> { | ||
| 820 | </span></span><span style="display:flex;"><span> sysfatal(<span style="color:#a31515">&#34;not enough memory&#34;</span>); | ||
| 821 | </span></span><span style="display:flex;"><span> } | ||
| 822 | </span></span><span style="display:flex;"><span> | ||
| 823 | </span></span><span style="display:flex;"><span> draw(screen, screen-&gt;r, bg, nil, ZP); | ||
| 824 | </span></span><span style="display:flex;"><span> draw(screen, screen-&gt;r, im, nil, Pt(-40, -40)); | ||
| 825 | </span></span><span style="display:flex;"><span> | ||
| 826 | </span></span><span style="display:flex;"><span> flushimage(display, Refnone); | ||
| 827 | </span></span><span style="display:flex;"><span> | ||
| 828 | </span></span><span style="display:flex;"><span> <span style="color:#008000">// Wait 10 seconds before exiting. | ||
| 829 | </span></span></span><span style="display:flex;"><span><span style="color:#008000"></span> sleep(10000); | ||
| 830 | </span></span><span style="display:flex;"><span> | ||
| 831 | </span></span><span style="display:flex;"><span> exits(nil); | ||
| 832 | </span></span><span style="display:flex;"><span>} | ||
| 833 | </span></span></code></pre><p>And then compile with <code>mk</code> (mkfile below):</p> | ||
| 834 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span><span style="color:#008000"># mkfile | ||
| 835 | </span></span></span><span style="display:flex;"><span><span style="color:#008000"></span><span style="">&lt;/$objtype/mkfile</span> | ||
| 836 | </span></span><span style="display:flex;"><span> | ||
| 837 | </span></span><span style="display:flex;"><span>RC=/rc/bin | ||
| 838 | </span></span><span style="display:flex;"><span>BIN=/$objtype/bin | ||
| 839 | </span></span><span style="display:flex;"><span>MAN=/sys/man | ||
| 840 | </span></span><span style="display:flex;"><span> | ||
| 841 | </span></span><span style="display:flex;"><span>main: | ||
| 842 | </span></span><span style="display:flex;"><span> $CC $CFLAGS main.c | ||
| 843 | </span></span><span style="display:flex;"><span> $LD $LDFLAGS -o main main.$O | ||
| 844 | </span></span></code></pre><p>And run with <code>./main</code>. To exit the program, press <code>Delete key</code> (strange but this | ||
| 845 | is the alternative for Ctrl+C).</p> | ||
| 846 | <p><em>This is <strong>very cool</strong> indeed!</em></p> | ||
| 847 | </content:encoded> | ||
| 848 | </item> | ||
| 849 | |||
| 850 | |||
| 851 | |||
| 852 | <item> | ||
| 853 | <title>Cronjobs on Github with Github Actions</title> | ||
| 854 | <link>https://mitjafelicijan.com/cronjobs-github-with-actions.html</link> | ||
| 855 | <pubDate>Sat, 27 May 2023 00:35:36 +0200</pubDate> | ||
| 856 | <guid>https://mitjafelicijan.com/cronjobs-github-with-actions.html</guid> | ||
| 857 | <description>In the root of your repository create a folder .</description> | ||
| 858 | <content:encoded><p>In the root of your repository create a folder <code>.github/workflows</code> and in that | ||
| 859 | folder create a file a file <code>cron.yaml</code>. This file can be named whatever you | ||
| 860 | wish. But it has to be a <code>yaml</code> file.</p> | ||
| 861 | <p>File below (<code>.github/workflows/cron.yaml</code>) describes an action that will trigger | ||
| 862 | every six hours and it will curl example.com.</p> | ||
| 863 | <p>However. Be sure that you have enough credits. Free account is not that generous | ||
| 864 | with the minutes they give you for free. Check more about GitHub Actions usage | ||
| 865 | on their website <a href="https://docs.github.com/en/actions">https://docs.github.com/en/actions</a>.</p> | ||
| 866 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span><span style="color:#008000"># .github/workflows/cron.yaml</span> | ||
| 867 | </span></span><span style="display:flex;"><span>name: Do a curl every 6 hours | ||
| 868 | </span></span><span style="display:flex;"><span>on: | ||
| 869 | </span></span><span style="display:flex;"><span> schedule: | ||
| 870 | </span></span><span style="display:flex;"><span> - cron: <span style="color:#a31515">&#39;0 */6 * * *&#39;</span> | ||
| 871 | </span></span><span style="display:flex;"><span>jobs: | ||
| 872 | </span></span><span style="display:flex;"><span> cron: | ||
| 873 | </span></span><span style="display:flex;"><span> runs-on: ubuntu-latest | ||
| 874 | </span></span><span style="display:flex;"><span> steps: | ||
| 875 | </span></span><span style="display:flex;"><span> - name: Call some url | ||
| 876 | </span></span><span style="display:flex;"><span> run: curl &#39;https://example.com&#39; | ||
| 877 | </span></span></code></pre></content:encoded> | ||
| 878 | </item> | ||
| 879 | |||
| 880 | |||
| 881 | |||
| 882 | <item> | ||
| 883 | <title>Dungeon Crawl Stone Soup - New player guide</title> | ||
| 884 | <link>https://mitjafelicijan.com/dcss-new-player-guide.html</link> | ||
| 885 | <pubDate>Thu, 25 May 2023 22:00:00 +0200</pubDate> | ||
| 886 | <guid>https://mitjafelicijan.com/dcss-new-player-guide.html</guid> | ||
| 887 | <description>An amazing game deserves an amazing guide.</description> | ||
| 888 | <content:encoded><p>An amazing game deserves an amazing guide. All this material can be find in some | ||
| 889 | form on another on <a href="https://github.com/crawl/crawl">craw's</a> official repository.</p> | ||
| 890 | <ul> | ||
| 891 | <li><a href="/notes/dcss-quickstart.pdf">DCSS Quickstart</a> - Very short introduction to the | ||
| 892 | game</li> | ||
| 893 | <li><a href="/notes/dcss_manual.pdf">DCSS Manual</a> - Extensive manual about the game</li> | ||
| 894 | </ul> | ||
| 895 | <figure> | ||
| 896 | <img src="/notes/dcss.jpg" alt="Dungeon Crawl Stone Soup" /> | ||
| 897 | </figure> | ||
| 898 | <p><strong>Movement and Exploration</strong></p> | ||
| 899 | <ul> | ||
| 900 | <li>You can move around with the numpad (try numlock on and off), vi-keys, or | ||
| 901 | clicking with the mouse. Arrow keys work, though you can't move diagonally | ||
| 902 | with them. Pressing Shift and a direction will move until you see/hit | ||
| 903 | something.</li> | ||
| 904 | <li>Pressing <code>&gt;</code> will take you down a staircase, and <code>&lt;</code> to go up a staircase.</li> | ||
| 905 | <li>You can open doors by walking into them, and close them with <code>C</code>.</li> | ||
| 906 | <li>You can autoexplore by pressing <code>o</code>.</li> | ||
| 907 | <li>You can re-view recent messages with <code>Ctrl-p</code>.</li> | ||
| 908 | </ul> | ||
| 909 | <p><strong>Monsters and Combat</strong></p> | ||
| 910 | <ul> | ||
| 911 | <li>You can pick up items with <code>,</code> or <code>g</code>.</li> | ||
| 912 | <li>Wield weapons with <code>w</code>. Weapons have different stats. | ||
| 913 | <ul> | ||
| 914 | <li>(You may also engage in Unarmed Combat, though it isn't very effective when | ||
| 915 | untrained).</li> | ||
| 916 | </ul> | ||
| 917 | </li> | ||
| 918 | <li>Attack monsters in melee by walking in their direction (or with | ||
| 919 | Ctrl-direction).</li> | ||
| 920 | <li>You can wait with <code>.</code> or <code>s</code>, passing your turn - such as to get monsters into | ||
| 921 | a corridor with you.</li> | ||
| 922 | <li>You can rest with <code>5</code>, waiting until you are fully healed, or something | ||
| 923 | noteworthy happens.</li> | ||
| 924 | <li>Either mouseover and rightclick, or use <code>x</code> then <code>v</code> on the monster to examine | ||
| 925 | monsters. Monsters with a red border are 'dangerous' relative to your current | ||
| 926 | XP level (XL).</li> | ||
| 927 | <li>Quiver (often ranged) actions for further use with <code>Q</code>.</li> | ||
| 928 | <li>You can fire ranged weapons manually with <code>f</code>, or auto-target your quiver with | ||
| 929 | <code>p</code> or <code>Shift-Tab</code>. Throwing weapons can be thrown immediately, while | ||
| 930 | launchers (like bows) need to be wielded first.</li> | ||
| 931 | </ul> | ||
| 932 | <p><strong>Items and Inventory</strong></p> | ||
| 933 | <ul> | ||
| 934 | <li>View your inventory by pressing <code>i</code>. Most item related commands can also be | ||
| 935 | done with this menu.</li> | ||
| 936 | <li>You can wear amour with <code>W;</code> amour gives <code>AC</code>, while heavier body armour | ||
| 937 | reduces <code>EV</code>.</li> | ||
| 938 | <li>Autoexplore will automatically pick up useful items, such as potions and | ||
| 939 | scrolls, if you aren't in danger.</li> | ||
| 940 | <li>You can read scrolls with <code>r</code> and drink (&quot;quaff&quot;) potions with <code>q</code>.</li> | ||
| 941 | <li>Equipment items may have brands, with special properties. Branded equipment is | ||
| 942 | blue when unidentified.</li> | ||
| 943 | <li>Equipment items may be artifacts, often with unique properties, and are | ||
| 944 | unmodifiable. They are written in white.</li> | ||
| 945 | <li>You can evoke wands with <code>V</code>.</li> | ||
| 946 | <li>You can put on jewelry with <code>P</code>, and remove it with <code>R</code>.</li> | ||
| 947 | <li>Gold is used in shops, which can be interacted with by either <code>&gt;</code> or <code>&lt;</code>.</li> | ||
| 948 | </ul> | ||
| 949 | <p><strong>Magic and Spellcasting</strong></p> | ||
| 950 | <ul> | ||
| 951 | <li>Once you find a spellbook, you can memorize spells with <code>M</code>.</li> | ||
| 952 | <li>You need to be the same XL as the spell's spell level in order to learn it, in | ||
| 953 | addition to training magical skill (to lower failure rate).</li> | ||
| 954 | <li>Cast spells by pressing <code>z</code>, then the letter assigned to the spell. You may | ||
| 955 | also Quiver a spell and then use it like a ranged weapon (with Shift-Tab).</li> | ||
| 956 | <li>You can view your memorized spells by pressing <code>I</code> (capital-i) or <code>z</code>.</li> | ||
| 957 | <li>Like HP, you can recover MP by resting (with 5).</li> | ||
| 958 | <li>Many spells can be positioned more effectively, or combined with other spells, | ||
| 959 | in order to get (more effective) use out of them.</li> | ||
| 960 | <li>Heavier body amour and shields hamper spellcasting.</li> | ||
| 961 | </ul> | ||
| 962 | <p><strong>Gods and Divine Abilities</strong></p> | ||
| 963 | <ul> | ||
| 964 | <li>You may look at a god's overview by praying at their altar (with <code>&gt;</code> or <code>&lt;</code>). | ||
| 965 | After praying, you can worship the god by pressing Enter afterwards.</li> | ||
| 966 | <li>Gods all have unique features about them. Trog, the god of the tutorial, is | ||
| 967 | also the god of rage and bloodshed, and so despises spellcasting.</li> | ||
| 968 | <li>Gods like and dislike different things. Most gods either like killing things | ||
| 969 | (like Trog) or exploring new areas (like Elyvilon), rewarding you piety | ||
| 970 | (divine favor) for doing so.</li> | ||
| 971 | <li>You should learn to use and even rely on divine abilities often, as they are | ||
| 972 | usually very strong. Trog's Berserk gives you 1.5x health, 1.5x speed (to all | ||
| 973 | valid actions), and a big damage boost. Note that Berserk prevents most | ||
| 974 | actions other than move and melee attack, and runs out very quickly if you | ||
| 975 | aren't attacking. And after berserk ends, you are slowed down and can't | ||
| 976 | berserk again for a short time.</li> | ||
| 977 | <li>In addition, the vast majority of abilities consume piety in the process. | ||
| 978 | Regardless, this ability is very cheap, and the benefits are incredible, so | ||
| 979 | don't hold back!</li> | ||
| 980 | <li>Pressing <code>^</code> will let you view your current god, abilities, and piety.</li> | ||
| 981 | </ul> | ||
| 982 | </content:encoded> | ||
| 983 | </item> | ||
| 984 | |||
| 985 | |||
| 986 | |||
| 987 | <item> | ||
| 988 | <title>Display xterm color palette</title> | ||
| 989 | <link>https://mitjafelicijan.com/xterm-color-palette.html</link> | ||
| 990 | <pubDate>Thu, 25 May 2023 12:00:00 +0200</pubDate> | ||
| 991 | <guid>https://mitjafelicijan.com/xterm-color-palette.html</guid> | ||
| 992 | <description>bash xterm-palette.</description> | ||
| 993 | <content:encoded><ul> | ||
| 994 | <li><code>bash xterm-palette.sh</code> - will show you number of max colors available</li> | ||
| 995 | <li><code>bash xterm-palette.sh -v</code> - will create a list of all colors with codes</li> | ||
| 996 | </ul> | ||
| 997 | <figure> | ||
| 998 | <img src="/notes/xterm-palette.png" alt="xterm color palette" /> | ||
| 999 | </figure> | ||
| 1000 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span><span style="color:#00f">#!/usr/bin/env bash | ||
| 1001 | </span></span></span><span style="display:flex;"><span><span style="color:#00f"></span><span style="color:#008000"># xterm-palette.sh</span> | ||
| 1002 | </span></span><span style="display:flex;"><span> | ||
| 1003 | </span></span><span style="display:flex;"><span>trap <span style="color:#a31515">&#39;tput sgr0&#39;</span> exit <span style="color:#008000"># Clean up even if user hits ^C</span> | ||
| 1004 | </span></span><span style="display:flex;"><span> | ||
| 1005 | </span></span><span style="display:flex;"><span><span style="color:#00f">function</span> setfg () { | ||
| 1006 | </span></span><span style="display:flex;"><span> printf <span style="color:#a31515">&#39;\e[38;5;%dm&#39;</span> $1 | ||
| 1007 | </span></span><span style="display:flex;"><span>} | ||
| 1008 | </span></span><span style="display:flex;"><span> | ||
| 1009 | </span></span><span style="display:flex;"><span><span style="color:#00f">function</span> setbg () { | ||
| 1010 | </span></span><span style="display:flex;"><span> printf <span style="color:#a31515">&#39;\e[48;5;%dm&#39;</span> $1 | ||
| 1011 | </span></span><span style="display:flex;"><span>} | ||
| 1012 | </span></span><span style="display:flex;"><span> | ||
| 1013 | </span></span><span style="display:flex;"><span><span style="color:#00f">function</span> showcolors() { | ||
| 1014 | </span></span><span style="display:flex;"><span> <span style="color:#008000"># Given an integer, display that many colors</span> | ||
| 1015 | </span></span><span style="display:flex;"><span> <span style="color:#00f">for</span> ((i=0; i&lt;$1; i++)) | ||
| 1016 | </span></span><span style="display:flex;"><span> <span style="color:#00f">do</span> | ||
| 1017 | </span></span><span style="display:flex;"><span> printf <span style="color:#a31515">&#39;%4d &#39;</span> $i | ||
| 1018 | </span></span><span style="display:flex;"><span> setbg $i | ||
| 1019 | </span></span><span style="display:flex;"><span> tput el | ||
| 1020 | </span></span><span style="display:flex;"><span> tput sgr0 | ||
| 1021 | </span></span><span style="display:flex;"><span> echo | ||
| 1022 | </span></span><span style="display:flex;"><span> <span style="color:#00f">done</span> | ||
| 1023 | </span></span><span style="display:flex;"><span> tput sgr0 el | ||
| 1024 | </span></span><span style="display:flex;"><span>} | ||
| 1025 | </span></span><span style="display:flex;"><span> | ||
| 1026 | </span></span><span style="display:flex;"><span><span style="color:#008000"># First, test if terminal supports OSC 4 at all.</span> | ||
| 1027 | </span></span><span style="display:flex;"><span>printf <span style="color:#a31515">&#39;\e]4;%d;?\a&#39;</span> 0 | ||
| 1028 | </span></span><span style="display:flex;"><span>read -d <span style="color:#a31515">$&#39;\a&#39;</span> -s -t 0.1 &lt;/dev/tty | ||
| 1029 | </span></span><span style="display:flex;"><span><span style="color:#00f">if</span> [ -z <span style="color:#a31515">&#34;</span>$REPLY<span style="color:#a31515">&#34;</span> ] | ||
| 1030 | </span></span><span style="display:flex;"><span><span style="color:#00f">then</span> | ||
| 1031 | </span></span><span style="display:flex;"><span> <span style="color:#008000"># OSC 4 not supported, so we&#39;ll fall back to terminfo</span> | ||
| 1032 | </span></span><span style="display:flex;"><span> max=<span style="color:#00f">$(</span>tput colors<span style="color:#00f">)</span> | ||
| 1033 | </span></span><span style="display:flex;"><span><span style="color:#00f">else</span> | ||
| 1034 | </span></span><span style="display:flex;"><span> <span style="color:#008000"># OSC 4 is supported, so use it for a binary search</span> | ||
| 1035 | </span></span><span style="display:flex;"><span> min=0 | ||
| 1036 | </span></span><span style="display:flex;"><span> max=256 | ||
| 1037 | </span></span><span style="display:flex;"><span> <span style="color:#00f">while</span> [[ <span style="color:#00f">$((</span>min+1<span style="color:#00f">))</span> -lt $max ]] | ||
| 1038 | </span></span><span style="display:flex;"><span> <span style="color:#00f">do</span> | ||
| 1039 | </span></span><span style="display:flex;"><span> i=<span style="color:#00f">$((</span> (min+max)/2 <span style="color:#00f">))</span> | ||
| 1040 | </span></span><span style="display:flex;"><span> printf <span style="color:#a31515">&#39;\e]4;%d;?\a&#39;</span> $i | ||
| 1041 | </span></span><span style="display:flex;"><span> read -d <span style="color:#a31515">$&#39;\a&#39;</span> -s -t 0.1 &lt;/dev/tty | ||
| 1042 | </span></span><span style="display:flex;"><span> <span style="color:#00f">if</span> [ -z <span style="color:#a31515">&#34;</span>$REPLY<span style="color:#a31515">&#34;</span> ] | ||
| 1043 | </span></span><span style="display:flex;"><span> <span style="color:#00f">then</span> | ||
| 1044 | </span></span><span style="display:flex;"><span> max=$i | ||
| 1045 | </span></span><span style="display:flex;"><span> <span style="color:#00f">else</span> | ||
| 1046 | </span></span><span style="display:flex;"><span> min=$i | ||
| 1047 | </span></span><span style="display:flex;"><span> <span style="color:#00f">fi</span> | ||
| 1048 | </span></span><span style="display:flex;"><span> <span style="color:#00f">done</span> | ||
| 1049 | </span></span><span style="display:flex;"><span><span style="color:#00f">fi</span> | ||
| 1050 | </span></span><span style="display:flex;"><span> | ||
| 1051 | </span></span><span style="display:flex;"><span> | ||
| 1052 | </span></span><span style="display:flex;"><span><span style="color:#008000"># If -v is given, show all the colors</span> | ||
| 1053 | </span></span><span style="display:flex;"><span><span style="color:#00f">case</span> <span style="color:#a31515">${</span>1-none<span style="color:#a31515">}</span> in | ||
| 1054 | </span></span><span style="display:flex;"><span> none) | ||
| 1055 | </span></span><span style="display:flex;"><span> echo $max | ||
| 1056 | </span></span><span style="display:flex;"><span> ;; | ||
| 1057 | </span></span><span style="display:flex;"><span> -v) | ||
| 1058 | </span></span><span style="display:flex;"><span> showcolors $max | ||
| 1059 | </span></span><span style="display:flex;"><span> ;; | ||
| 1060 | </span></span><span style="display:flex;"><span> *) | ||
| 1061 | </span></span><span style="display:flex;"><span> <span style="color:#00f">if</span> [[ <span style="color:#a31515">&#34;</span>$1<span style="color:#a31515">&#34;</span> -gt 0 ]]; <span style="color:#00f">then</span> | ||
| 1062 | </span></span><span style="display:flex;"><span> showcolors $1 | ||
| 1063 | </span></span><span style="display:flex;"><span> <span style="color:#00f">else</span> | ||
| 1064 | </span></span><span style="display:flex;"><span> echo $max | ||
| 1065 | </span></span><span style="display:flex;"><span> <span style="color:#00f">fi</span> | ||
| 1066 | </span></span><span style="display:flex;"><span> ;; | ||
| 1067 | </span></span><span style="display:flex;"><span><span style="color:#00f">esac</span> | less --raw-control-chars --QUIT-AT-EOF --no-init | ||
| 1068 | </span></span></code></pre></content:encoded> | ||
| 1069 | </item> | ||
| 1070 | |||
| 1071 | |||
| 1072 | |||
| 1073 | <item> | ||
| 1074 | <title>Sane defaults for tmux with more visible statusbar</title> | ||
| 1075 | <link>https://mitjafelicijan.com/tmux-sane-defaults.html</link> | ||
| 1076 | <pubDate>Thu, 25 May 2023 12:00:00 +0200</pubDate> | ||
| 1077 | <guid>https://mitjafelicijan.com/tmux-sane-defaults.html</guid> | ||
| 1078 | <description># Remap prefix from &#39;C-b&#39; to &#39;M-a&#39;.</description> | ||
| 1079 | <content:encoded><pre><code class="language-conf"># Remap prefix from 'C-b' to 'M-a'. | ||
| 1080 | unbind C-b | ||
| 1081 | set-option -g prefix M-a | ||
| 1082 | bind-key M-a send-prefix | ||
| 1083 | |||
| 1084 | # Split panes using | and -. | ||
| 1085 | bind | split-window -h | ||
| 1086 | bind - split-window -v | ||
| 1087 | unbind '&quot;' | ||
| 1088 | unbind % | ||
| 1089 | |||
| 1090 | # Start counting windows with 1. | ||
| 1091 | set-option -g allow-rename on | ||
| 1092 | set -g base-index 1 | ||
| 1093 | setw -g pane-base-index 1 | ||
| 1094 | |||
| 1095 | # Statusbar: purple bg and white fg. | ||
| 1096 | set -g status-bg '#480b8e' | ||
| 1097 | set -g status-fg '#ffffff' | ||
| 1098 | |||
| 1099 | # Active window: black bg and white fg. | ||
| 1100 | set -g window-status-current-format &quot;#[fg=#ffffff]#[bg=#111111]#[fg=#ffffff]#[bg=#111111] #I:#W #[fg=#ffffff]#[bg=#111111]&quot; | ||
| 1101 | |||
| 1102 | # Disable mouse mode (tmux 2.1 and above). | ||
| 1103 | set -g mouse off | ||
| 1104 | </code></pre> | ||
| 1105 | </content:encoded> | ||
| 1106 | </item> | ||
| 1107 | |||
| 1108 | |||
| 1109 | |||
| 1110 | <item> | ||
| 1111 | <title>My brand new Plan9/9front desktop</title> | ||
| 1112 | <link>https://mitjafelicijan.com/fresh-9front-desktop.html</link> | ||
| 1113 | <pubDate>Wed, 24 May 2023 12:00:00 +0200</pubDate> | ||
| 1114 | <guid>https://mitjafelicijan.com/fresh-9front-desktop.html</guid> | ||
| 1115 | <description>I have been experimenting with Plan9/9front for a week now.</description> | ||
| 1116 | <content:encoded><p>I have been experimenting with Plan9/9front for a week now. Noice! This is how | ||
| 1117 | my desktop looks like.</p> | ||
| 1118 | <figure> | ||
| 1119 | <img src="/notes/9front-desktop.png" alt="9front desktop" /> | ||
| 1120 | </figure> | ||
| 1121 | </content:encoded> | ||
| 1122 | </item> | ||
| 1123 | |||
| 1124 | |||
| 1125 | |||
| 1126 | |||
| 1127 | |||
| 1128 | <item> | ||
| 1129 | <title>Parse RSS feeds with Lua</title> | ||
| 1130 | <link>https://mitjafelicijan.com/parse-rss-with-lua.html</link> | ||
| 1131 | <pubDate>Tue, 23 May 2023 12:00:00 +0200</pubDate> | ||
| 1132 | <guid>https://mitjafelicijan.com/parse-rss-with-lua.html</guid> | ||
| 1133 | <description>Example of parsing RSS feeds with Lua.</description> | ||
| 1134 | <content:encoded><p>Example of parsing RSS feeds with Lua. Before running the script install:</p> | ||
| 1135 | <ul> | ||
| 1136 | <li>feedparser with <code>luarocks install feedparser</code></li> | ||
| 1137 | <li>luasocket with <code>luarocks install luasocket</code></li> | ||
| 1138 | </ul> | ||
| 1139 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span><span style="color:#00f">local</span> http = require(<span style="color:#a31515">&#34;socket.http&#34;</span>) | ||
| 1140 | </span></span><span style="display:flex;"><span><span style="color:#00f">local</span> feedparser = require(<span style="color:#a31515">&#34;feedparser&#34;</span>) | ||
| 1141 | </span></span><span style="display:flex;"><span> | ||
| 1142 | </span></span><span style="display:flex;"><span><span style="color:#00f">local</span> feed_url = <span style="color:#a31515">&#34;https://mitjafelicijan.com/index.xml&#34;</span> | ||
| 1143 | </span></span><span style="display:flex;"><span> | ||
| 1144 | </span></span><span style="display:flex;"><span><span style="color:#00f">local</span> response, status, _ = http.request(feed_url) | ||
| 1145 | </span></span><span style="display:flex;"><span><span style="color:#00f">if</span> status == 200 <span style="color:#00f">then</span> | ||
| 1146 | </span></span><span style="display:flex;"><span> <span style="color:#00f">local</span> parsed = feedparser.parse(response) | ||
| 1147 | </span></span><span style="display:flex;"><span> | ||
| 1148 | </span></span><span style="display:flex;"><span> <span style="color:#008000">-- Print out feed details.</span> | ||
| 1149 | </span></span><span style="display:flex;"><span> print(<span style="color:#a31515">&#34;&gt; Title &#34;</span>, parsed.feed.title) | ||
| 1150 | </span></span><span style="display:flex;"><span> print(<span style="color:#a31515">&#34;&gt; Author &#34;</span>, parsed.feed.author) | ||
| 1151 | </span></span><span style="display:flex;"><span> print(<span style="color:#a31515">&#34;&gt; ID &#34;</span>, parsed.feed.id) | ||
| 1152 | </span></span><span style="display:flex;"><span> print(<span style="color:#a31515">&#34;&gt; Entries &#34;</span>, #parsed.entries) | ||
| 1153 | </span></span><span style="display:flex;"><span> | ||
| 1154 | </span></span><span style="display:flex;"><span> <span style="color:#00f">for</span> _, item <span style="color:#00f">in</span> ipairs(parsed.entries) <span style="color:#00f">do</span> | ||
| 1155 | </span></span><span style="display:flex;"><span> print(<span style="color:#a31515">&#34;GUID &#34;</span>, item.guid) | ||
| 1156 | </span></span><span style="display:flex;"><span> print(<span style="color:#a31515">&#34;Title &#34;</span>, item.title) | ||
| 1157 | </span></span><span style="display:flex;"><span> print(<span style="color:#a31515">&#34;Link &#34;</span>, item.link) | ||
| 1158 | </span></span><span style="display:flex;"><span> print(<span style="color:#a31515">&#34;Summary &#34;</span>, item.summary) | ||
| 1159 | </span></span><span style="display:flex;"><span> <span style="color:#00f">end</span> | ||
| 1160 | </span></span><span style="display:flex;"><span><span style="color:#00f">else</span> | ||
| 1161 | </span></span><span style="display:flex;"><span> print(<span style="color:#a31515">&#34;! Request failed. Status:&#34;</span>, status) | ||
| 1162 | </span></span><span style="display:flex;"><span><span style="color:#00f">end</span> | ||
| 1163 | </span></span></code></pre></content:encoded> | ||
| 1164 | </item> | ||
| 1165 | |||
| 1166 | |||
| 1167 | |||
| 1168 | <item> | ||
| 1169 | <title>Extend Lua with custom C functions using Clang</title> | ||
| 1170 | <link>https://mitjafelicijan.com/extend-lua-with-custom-c.html</link> | ||
| 1171 | <pubDate>Tue, 23 May 2023 12:00:00 +0200</pubDate> | ||
| 1172 | <guid>https://mitjafelicijan.com/extend-lua-with-custom-c.html</guid> | ||
| 1173 | <description>Here is a boilerplate for extending Lua with custom C functions.</description> | ||
| 1174 | <content:encoded><p>Here is a boilerplate for extending Lua with custom C functions. This requires | ||
| 1175 | Clang and Lua 5.1 to be installed. GCC can be used instead of Clang, but the | ||
| 1176 | Makefile will need to be modified.</p> | ||
| 1177 | <ul> | ||
| 1178 | <li> | ||
| 1179 | <p>nativefunc.c</p> | ||
| 1180 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span><span style="color:#00f">#include</span> <span style="color:#00f">&lt;lua.h&gt;</span><span style="color:#00f"> | ||
| 1181 | </span></span></span><span style="display:flex;"><span><span style="color:#00f">#include</span> <span style="color:#00f">&lt;lauxlib.h&gt;</span><span style="color:#00f"> | ||
| 1182 | </span></span></span><span style="display:flex;"><span><span style="color:#00f"></span> | ||
| 1183 | </span></span><span style="display:flex;"><span><span style="color:#00f">static</span> <span style="color:#2b91af">int</span> l_mult50(lua_State *L) { | ||
| 1184 | </span></span><span style="display:flex;"><span> <span style="color:#2b91af">double</span> number = luaL_checknumber(L, 1); | ||
| 1185 | </span></span><span style="display:flex;"><span> lua_pushnumber(L, number * 50); | ||
| 1186 | </span></span><span style="display:flex;"><span> <span style="color:#00f">return</span> 1; | ||
| 1187 | </span></span><span style="display:flex;"><span>} | ||
| 1188 | </span></span><span style="display:flex;"><span> | ||
| 1189 | </span></span><span style="display:flex;"><span><span style="color:#2b91af">int</span> luaopen_nativefunc(lua_State *L) { | ||
| 1190 | </span></span><span style="display:flex;"><span> <span style="color:#00f">static</span> <span style="color:#00f">const</span> <span style="color:#00f">struct</span> luaL_Reg nativeFuncLib[] = {{<span style="color:#a31515">&#34;mult50&#34;</span>, l_mult50}, {NULL, NULL}}; | ||
| 1191 | </span></span><span style="display:flex;"><span> | ||
| 1192 | </span></span><span style="display:flex;"><span> luaL_register(L, <span style="color:#a31515">&#34;nativelib&#34;</span>, nativeFuncLib); | ||
| 1193 | </span></span><span style="display:flex;"><span> <span style="color:#00f">return</span> 1; | ||
| 1194 | </span></span><span style="display:flex;"><span>} | ||
| 1195 | </span></span></code></pre></li> | ||
| 1196 | <li> | ||
| 1197 | <p>main.lua</p> | ||
| 1198 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span>require <span style="color:#a31515">&#34;nativefunc&#34;</span> | ||
| 1199 | </span></span><span style="display:flex;"><span>print(nativelib.mult50(50)) | ||
| 1200 | </span></span></code></pre></li> | ||
| 1201 | <li> | ||
| 1202 | <p>Makefile</p> | ||
| 1203 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span>CC = clang | ||
| 1204 | </span></span><span style="display:flex;"><span>CFLAGS = | ||
| 1205 | </span></span><span style="display:flex;"><span>INCLUDES = <span style="color:#a31515">`</span>pkg-config lua5.1 --cflags-only-I<span style="color:#a31515">`</span> | ||
| 1206 | </span></span><span style="display:flex;"><span> | ||
| 1207 | </span></span><span style="display:flex;"><span>all: | ||
| 1208 | </span></span><span style="display:flex;"><span> <span style="color:#00f">$(</span>CC<span style="color:#00f">)</span> -shared -o nativefunc.so -fPIC nativefunc.c <span style="color:#00f">$(</span>CFLAGS<span style="color:#00f">)</span> <span style="color:#00f">$(</span>INCLUDES<span style="color:#00f">)</span> | ||
| 1209 | </span></span><span style="display:flex;"><span> | ||
| 1210 | </span></span><span style="display:flex;"><span>clean: | ||
| 1211 | </span></span><span style="display:flex;"><span> rm *.so | ||
| 1212 | </span></span></code></pre></li> | ||
| 1213 | </ul> | ||
| 1214 | </content:encoded> | ||
| 1215 | </item> | ||
| 1216 | |||
| 1217 | |||
| 1218 | |||
| 1219 | <item> | ||
| 1220 | <title>Execute not blocking async shell command in C#</title> | ||
| 1221 | <link>https://mitjafelicijan.com/non-blocking-shell-exec-csharp.html</link> | ||
| 1222 | <pubDate>Mon, 22 May 2023 12:00:00 +0200</pubDate> | ||
| 1223 | <guid>https://mitjafelicijan.com/non-blocking-shell-exec-csharp.html</guid> | ||
| 1224 | <description>Execute a shell command in async in C# while not blocking the UI thread.</description> | ||
| 1225 | <content:encoded><p>Execute a shell command in async in C# while not blocking the UI thread.</p> | ||
| 1226 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span><span style="color:#00f">private</span> <span style="color:#00f">async</span> Task executeCopyCommand() | ||
| 1227 | </span></span><span style="display:flex;"><span>{ | ||
| 1228 | </span></span><span style="display:flex;"><span> <span style="color:#00f">await</span> Task.Run(() =&gt; | ||
| 1229 | </span></span><span style="display:flex;"><span> { | ||
| 1230 | </span></span><span style="display:flex;"><span> <span style="color:#2b91af">var</span> processStartInfo = <span style="color:#00f">new</span> ProcessStartInfo(<span style="color:#a31515">&#34;cmd&#34;</span>, <span style="color:#a31515">&#34;/c dir&#34;</span>) | ||
| 1231 | </span></span><span style="display:flex;"><span> { | ||
| 1232 | </span></span><span style="display:flex;"><span> RedirectStandardOutput = <span style="color:#00f">true</span>, | ||
| 1233 | </span></span><span style="display:flex;"><span> UseShellExecute = <span style="color:#00f">false</span>, | ||
| 1234 | </span></span><span style="display:flex;"><span> CreateNoWindow = <span style="color:#00f">true</span> | ||
| 1235 | </span></span><span style="display:flex;"><span> }; | ||
| 1236 | </span></span><span style="display:flex;"><span> | ||
| 1237 | </span></span><span style="display:flex;"><span> <span style="color:#2b91af">var</span> process = <span style="color:#00f">new</span> Process | ||
| 1238 | </span></span><span style="display:flex;"><span> { | ||
| 1239 | </span></span><span style="display:flex;"><span> StartInfo = processStartInfo | ||
| 1240 | </span></span><span style="display:flex;"><span> }; | ||
| 1241 | </span></span><span style="display:flex;"><span> | ||
| 1242 | </span></span><span style="display:flex;"><span> process.Start(); | ||
| 1243 | </span></span><span style="display:flex;"><span> process.WaitForExit(); | ||
| 1244 | </span></span><span style="display:flex;"><span> }); | ||
| 1245 | </span></span><span style="display:flex;"><span>} | ||
| 1246 | </span></span></code></pre><p>Make sure that <code>async</code> is present in the function definition and <code>await</code> is used | ||
| 1247 | in the method that calls <code>executeCopyCommand()</code>.</p> | ||
| 1248 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span><span style="color:#00f">private</span> <span style="color:#00f">async</span> <span style="color:#00f">void</span> button_Click(<span style="color:#2b91af">object</span> sender, EventArgs e) | ||
| 1249 | </span></span><span style="display:flex;"><span>{ | ||
| 1250 | </span></span><span style="display:flex;"><span> <span style="color:#00f">await</span> executeCopyCommand(); | ||
| 1251 | </span></span><span style="display:flex;"><span>} | ||
| 1252 | </span></span></code></pre></content:encoded> | ||
| 1253 | </item> | ||
| 1254 | |||
| 1255 | |||
| 1256 | |||
| 1257 | <item> | ||
| 1258 | <title>Change permissions of matching files recursively</title> | ||
| 1259 | <link>https://mitjafelicijan.com/mass-set-permission.html</link> | ||
| 1260 | <pubDate>Tue, 16 May 2023 12:00:00 +0200</pubDate> | ||
| 1261 | <guid>https://mitjafelicijan.com/mass-set-permission.html</guid> | ||
| 1262 | <description>Replace *.</description> | ||
| 1263 | <content:encoded><p>Replace <code>*.xml</code> with your pattern. This will remove executable bit from all | ||
| 1264 | files matching the pattern. Change <code>+</code> to <code>-</code> to add executable bit.</p> | ||
| 1265 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span>find . -type f -name <span style="color:#a31515">&#34;*.xml&#34;</span> -exec chmod -x {} + | ||
| 1266 | </span></span></code></pre></content:encoded> | ||
| 1267 | </item> | ||
| 1268 | |||
| 1269 | |||
| 1270 | |||
| 1271 | |||
| 1272 | |||
| 1273 | <item> | ||
| 1274 | <title>Previews how man page written in Troff will look like</title> | ||
| 1275 | <link>https://mitjafelicijan.com/preview-troff-man-pages.html</link> | ||
| 1276 | <pubDate>Mon, 15 May 2023 12:00:00 +0200</pubDate> | ||
| 1277 | <guid>https://mitjafelicijan.com/preview-troff-man-pages.html</guid> | ||
| 1278 | <description>Troff is used to write man pages and it is difficult to read it so this willpreview how it will look like when it is rendered.</description> | ||
| 1279 | <content:encoded><p>Troff is used to write man pages and it is difficult to read it so this will | ||
| 1280 | preview how it will look like when it is rendered.</p> | ||
| 1281 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span><span style="color:#008000"># On Linux system.</span> | ||
| 1282 | </span></span><span style="display:flex;"><span>groff -man -Tascii filename | ||
| 1283 | </span></span><span style="display:flex;"><span> | ||
| 1284 | </span></span><span style="display:flex;"><span><span style="color:#008000"># On Plan9 system.</span> | ||
| 1285 | </span></span><span style="display:flex;"><span>man 1 filename | ||
| 1286 | </span></span></code></pre></content:encoded> | ||
| 1287 | </item> | ||
| 1288 | |||
| 1289 | |||
| 1290 | |||
| 1291 | <item> | ||
| 1292 | <title>Convert all MKV files into other formats</title> | ||
| 1293 | <link>https://mitjafelicijan.com/convert-mkv.html</link> | ||
| 1294 | <pubDate>Sun, 14 May 2023 12:00:00 +0200</pubDate> | ||
| 1295 | <guid>https://mitjafelicijan.com/convert-mkv.html</guid> | ||
| 1296 | <description>You will need ffmpeg installed on your system.</description> | ||
| 1297 | <content:encoded><p>You will need <code>ffmpeg</code> installed on your system. This will convert all MKV files | ||
| 1298 | into WebM format.</p> | ||
| 1299 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span><span style="color:#008000"># Convert all MKV files into WebM format.</span> | ||
| 1300 | </span></span><span style="display:flex;"><span>find ./ -name <span style="color:#a31515">&#39;*.mkv&#39;</span> -exec bash -c <span style="color:#a31515">&#39;ffmpeg -i &#34;$0&#34; -vcodec libvpx -acodec libvorbis -cpu-used 5 -threads 8 &#34;${0%%.mp4}.webm&#34;&#39;</span> {} <span style="color:#a31515">\;</span> | ||
| 1301 | </span></span></code></pre><pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span><span style="color:#008000"># Convert all MKV files into MP4 format.</span> | ||
| 1302 | </span></span><span style="display:flex;"><span>find ./ -name <span style="color:#a31515">&#39;*.mkv&#39;</span> -exec bash -c <span style="color:#a31515">&#39;ffmpeg -i &#34;$0&#34; c:a copy -c:v copy -cpu-used 5 -threads 8 &#34;${0%%.mp4}.mp4&#34;&#39;</span> {} <span style="color:#a31515">\;</span> | ||
| 1303 | </span></span></code></pre></content:encoded> | ||
| 1304 | </item> | ||
| 1305 | |||
| 1306 | |||
| 1307 | |||
| 1308 | <item> | ||
| 1309 | <title>Download list of YouTube files</title> | ||
| 1310 | <link>https://mitjafelicijan.com/download-youtube-videos.html</link> | ||
| 1311 | <pubDate>Sat, 13 May 2023 12:00:00 +0200</pubDate> | ||
| 1312 | <guid>https://mitjafelicijan.com/download-youtube-videos.html</guid> | ||
| 1313 | <description>If you need to download a list of YouTube videos and don&#39;t want to download theactual YouTube list (which yt-dlp supports), you can use the following method.</description> | ||
| 1314 | <content:encoded><p>If you need to download a list of YouTube videos and don't want to download the | ||
| 1315 | actual YouTube list (which <code>yt-dlp</code> supports), you can use the following method.</p> | ||
| 1316 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span><span style="color:#008000">// Used to get list of raw URL&#39;s from YouTube&#39;s video tab&#39;. | ||
| 1317 | </span></span></span><span style="display:flex;"><span><span style="color:#008000">// Copy them into videos.txt. | ||
| 1318 | </span></span></span><span style="display:flex;"><span><span style="color:#008000"></span>document.querySelectorAll(<span style="color:#a31515">&#39;#contents a.ytd-thumbnail.style-scope.ytd-thumbnail&#39;</span>).forEach(el =&gt; console.log(el.href)) | ||
| 1319 | </span></span></code></pre><p>Download and install <a href="https://github.com/yt-dlp/yt-dlp">https://github.com/yt-dlp/yt-dlp</a>.</p> | ||
| 1320 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span><span style="color:#008000"># This will download all videos in videos.txt.</span> | ||
| 1321 | </span></span><span style="display:flex;"><span>yt-dlp --batch-file videos.txt -N <span style="color:#a31515">`</span>nproc<span style="color:#a31515">`</span> -f webm | ||
| 1322 | </span></span></code></pre></content:encoded> | ||
| 1323 | </item> | ||
| 1324 | |||
| 1325 | |||
| 1326 | |||
| 1327 | <item> | ||
| 1328 | <title>Install Plan9port on Linux</title> | ||
| 1329 | <link>https://mitjafelicijan.com/install-plan9port-linux.html</link> | ||
| 1330 | <pubDate>Fri, 12 May 2023 12:00:00 +0200</pubDate> | ||
| 1331 | <guid>https://mitjafelicijan.com/install-plan9port-linux.html</guid> | ||
| 1332 | <description>Install Plan9port on Linux.</description> | ||
| 1333 | <content:encoded><p>Install Plan9port on Linux. This applies to | ||
| 1334 | <a href="https://9fans.github.io/plan9port/">Plan9port</a>. This is a port of many Plan 9 | ||
| 1335 | programs to Unix-like operating systems. Useful for programs like <code>9term</code> and | ||
| 1336 | <code>rc</code>.</p> | ||
| 1337 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span>sudo apt-get install gcc libx11-dev libxt-dev libxext-dev libfontconfig1-dev | ||
| 1338 | </span></span><span style="display:flex;"><span>git clone https://github.com/9fans/plan9port $HOME/plan9 | ||
| 1339 | </span></span><span style="display:flex;"><span>cd $HOME/plan9/plan9port | ||
| 1340 | </span></span><span style="display:flex;"><span>./INSTALL -r $HOME/plan9 | ||
| 1341 | </span></span></code></pre></content:encoded> | ||
| 1342 | </item> | ||
| 1343 | |||
| 1344 | |||
| 1345 | |||
| 1346 | <item> | ||
| 1347 | <title>Fix bootloader not being written in Plan9</title> | ||
| 1348 | <link>https://mitjafelicijan.com/fix-plan9-bootloader.html</link> | ||
| 1349 | <pubDate>Thu, 11 May 2023 12:00:00 +0200</pubDate> | ||
| 1350 | <guid>https://mitjafelicijan.com/fix-plan9-bootloader.html</guid> | ||
| 1351 | <description>If the bootloader is not being written to a disk when installing 9front on realharware try clearing first sector of the disk with the following command.</description> | ||
| 1352 | <content:encoded><p>If the bootloader is not being written to a disk when installing 9front on real | ||
| 1353 | harware try clearing first sector of the disk with the following command.</p> | ||
| 1354 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span>dd <span style="color:#00f">if</span>=/dev/zero of=/dev/sdX bs=512 count=1 | ||
| 1355 | </span></span><span style="display:flex;"><span> | ||
| 1356 | </span></span><span style="display:flex;"><span><span style="color:#008000"># If command above doesn&#39;t work try this one, wait couple of seconds and</span> | ||
| 1357 | </span></span><span style="display:flex;"><span><span style="color:#008000"># press delete key to stop the command.</span> | ||
| 1358 | </span></span><span style="display:flex;"><span>cat &lt;/dev/zero &gt;/dev/sd*/data | ||
| 1359 | </span></span></code></pre></content:encoded> | ||
| 1360 | </item> | ||
| 1361 | |||
| 1362 | |||
| 1363 | |||
| 1364 | <item> | ||
| 1365 | <title>Take a screenshot in Plan9</title> | ||
| 1366 | <link>https://mitjafelicijan.com/plan9-screenshot.html</link> | ||
| 1367 | <pubDate>Wed, 10 May 2023 12:00:00 +0200</pubDate> | ||
| 1368 | <guid>https://mitjafelicijan.com/plan9-screenshot.html</guid> | ||
| 1369 | <description>Take a screenshot in Plan9.</description> | ||
| 1370 | <content:encoded><p>Take a screenshot in Plan9. This applies to <a href="https://9p.io/plan9/">Plan9</a> and | ||
| 1371 | <a href="https://9front.org/">9front</a>. This will take a screenshot of the screen and | ||
| 1372 | output it to <code>/dev/screen</code>. You can then use <code>topng</code> to convert it to a png | ||
| 1373 | image.</p> | ||
| 1374 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span><span style="color:#008000"># Instant screenshot.</span> | ||
| 1375 | </span></span><span style="display:flex;"><span>cat /dev/screen | topng &gt; screen.png | ||
| 1376 | </span></span><span style="display:flex;"><span> | ||
| 1377 | </span></span><span style="display:flex;"><span><span style="color:#008000"># Delayed screenshot (5 seconds).</span> | ||
| 1378 | </span></span><span style="display:flex;"><span>sleep 5; cat /dev/screen | topng &gt; screen.png | ||
| 1379 | </span></span></code></pre></content:encoded> | ||
| 1380 | </item> | ||
| 1381 | |||
| 1382 | |||
| 1383 | |||
| 1384 | <item> | ||
| 1385 | <title>#cat-v on weechat configuration</title> | ||
| 1386 | <link>https://mitjafelicijan.com/catv-weechat-config.html</link> | ||
| 1387 | <pubDate>Tue, 09 May 2023 12:00:00 +0200</pubDate> | ||
| 1388 | <guid>https://mitjafelicijan.com/catv-weechat-config.html</guid> | ||
| 1389 | <description>Set up weechat to connect to #cat-v on oftc.</description> | ||
| 1390 | <content:encoded><p>Set up weechat to connect to #cat-v on oftc. This applies to | ||
| 1391 | <a href="https://weechat.org/">weechat</a> but should be similar for other irc clients.</p> | ||
| 1392 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span><span style="color:#008000"># Install weechat and launch it and execute the following commands.</span> | ||
| 1393 | </span></span><span style="display:flex;"><span> | ||
| 1394 | </span></span><span style="display:flex;"><span>/server add oftc irc.oftc.net -tls | ||
| 1395 | </span></span><span style="display:flex;"><span>/set irc.server.oftc.autoconnect on | ||
| 1396 | </span></span><span style="display:flex;"><span>/set irc.server.oftc.autojoin <span style="color:#a31515">&#34;#cat-v&#34;</span> | ||
| 1397 | </span></span><span style="display:flex;"><span>/set irc.server.oftc.nicks <span style="color:#a31515">&#34;nick1,nick2,nick3&#34;</span> | ||
| 1398 | </span></span></code></pre></content:encoded> | ||
| 1399 | </item> | ||
| 1400 | |||
| 1401 | |||
| 1402 | |||
| 1403 | <item> | ||
| 1404 | <title>Write ISO to USB Key</title> | ||
| 1405 | <link>https://mitjafelicijan.com/write-iso-usb.html</link> | ||
| 1406 | <pubDate>Mon, 08 May 2023 12:00:00 +0200</pubDate> | ||
| 1407 | <guid>https://mitjafelicijan.com/write-iso-usb.html</guid> | ||
| 1408 | <description>Write ISO to USB key.</description> | ||
| 1409 | <content:encoded><p>Write ISO to USB key. Nothing fancy here.</p> | ||
| 1410 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span>sudo dd <span style="color:#00f">if</span>=iso_file.iso of=/dev/sdX bs=4M status=progress conv=fdatasync | ||
| 1411 | </span></span></code></pre></content:encoded> | ||
| 1412 | </item> | ||
| 1413 | |||
| 1414 | |||
| 1415 | |||
| 1416 | <item> | ||
| 1417 | <title>Mount Plan9 over network</title> | ||
| 1418 | <link>https://mitjafelicijan.com/mount-plan9-over-network.html</link> | ||
| 1419 | <pubDate>Sun, 07 May 2023 12:00:00 +0200</pubDate> | ||
| 1420 | <guid>https://mitjafelicijan.com/mount-plan9-over-network.html</guid> | ||
| 1421 | <description>First install libfuse with sudo apt install libfuse-dev.</description> | ||
| 1422 | <content:encoded><ul> | ||
| 1423 | <li>First install libfuse with sudo apt install libfuse-dev.</li> | ||
| 1424 | <li>Then clone <a href="https://github.com/ftrvxmtrx/9pfs">https://github.com/ftrvxmtrx/9pfs</a> and compile it with make.</li> | ||
| 1425 | <li>Copy 9pfs to your path.</li> | ||
| 1426 | </ul> | ||
| 1427 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span><span style="color:#008000"># On Plan9 side</span> | ||
| 1428 | </span></span><span style="display:flex;"><span>ip/ipconfig <span style="color:#008000"># enables network</span> | ||
| 1429 | </span></span><span style="display:flex;"><span>aux/listen1 -tv tcp!*!9999 /bin/exportfs -r tmp <span style="color:#008000"># export tmp folder</span> | ||
| 1430 | </span></span><span style="display:flex;"><span> | ||
| 1431 | </span></span><span style="display:flex;"><span><span style="color:#008000"># On Linux side</span> | ||
| 1432 | </span></span><span style="display:flex;"><span>9pfs 172.18.0.1 -p 9999 local_folder <span style="color:#008000"># mount</span> | ||
| 1433 | </span></span><span style="display:flex;"><span>umount local_folder <span style="color:#008000"># unmount</span> | ||
| 1434 | </span></span></code></pre></content:encoded> | ||
| 1435 | </item> | ||
| 1436 | |||
| 1437 | |||
| 1438 | |||
| 1439 | <item> | ||
| 1440 | <title>Push to multiple origins at once in Git</title> | ||
| 1441 | <link>https://mitjafelicijan.com/git-push-multiple-origins.html</link> | ||
| 1442 | <pubDate>Sat, 06 May 2023 12:00:00 +0200</pubDate> | ||
| 1443 | <guid>https://mitjafelicijan.com/git-push-multiple-origins.html</guid> | ||
| 1444 | <description>Sometimes you want to push to multiple origins at once.</description> | ||
| 1445 | <content:encoded><p>Sometimes you want to push to multiple origins at once. This is useful if you | ||
| 1446 | have a mirror of your repository on another server. You can do this by adding | ||
| 1447 | multiple push urls to your git config. This is a shorthand for command above.</p> | ||
| 1448 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span>git config --global alias.pushall <span style="color:#a31515">&#39;!sh -c &#34;git remote | xargs -L1 git push --all&#34;&#39;</span> | ||
| 1449 | </span></span></code></pre></content:encoded> | ||
| 1450 | </item> | ||
| 1451 | |||
| 1452 | |||
| 1453 | |||
| 1454 | <item> | ||
| 1455 | <title>Run 9front in Qemu</title> | ||
| 1456 | <link>https://mitjafelicijan.com/run-9front-in-qemu.html</link> | ||
| 1457 | <pubDate>Fri, 05 May 2023 12:00:00 +0200</pubDate> | ||
| 1458 | <guid>https://mitjafelicijan.com/run-9front-in-qemu.html</guid> | ||
| 1459 | <description>Run 9front in Qemu.</description> | ||
| 1460 | <content:encoded><p>Run 9front in Qemu. This applies to <a href="https://9p.io/plan9/">Plan9</a> and | ||
| 1461 | <a href="https://9front.org/">9front</a>.</p> | ||
| 1462 | <p>Download from here <a href="http://9front.org/iso/">http://9front.org/iso/</a>.</p> | ||
| 1463 | <pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span><span style="color:#008000"># Create a qcow2 image.</span> | ||
| 1464 | </span></span><span style="display:flex;"><span>qemu-img create -f qcow2 $HOME/VM/9front.qcow2.img 30G | ||
| 1465 | </span></span><span style="display:flex;"><span> | ||
| 1466 | </span></span><span style="display:flex;"><span><span style="color:#008000"># Run the VM.</span> | ||
| 1467 | </span></span><span style="display:flex;"><span>qemu-system-x86_64 -cpu host -enable-kvm -m 1024 <span style="color:#a31515">\ | ||
| 1468 | </span></span></span><span style="display:flex;"><span><span style="color:#a31515"></span> -net nic,model=virtio,macaddr=52:54:00:00:EE:03 -net user <span style="color:#a31515">\ | ||
| 1469 | </span></span></span><span style="display:flex;"><span><span style="color:#a31515"></span> -device virtio-scsi-pci,id=scsi <span style="color:#a31515">\ | ||
| 1470 | </span></span></span><span style="display:flex;"><span><span style="color:#a31515"></span> -drive <span style="color:#00f">if</span>=none,id=vd0,file=$HOME/VM/9front.qcow2.img <span style="color:#a31515">\ | ||
| 1471 | </span></span></span><span style="display:flex;"><span><span style="color:#a31515"></span> -device scsi-hd,drive=vd0 <span style="color:#a31515">\ | ||
| 1472 | </span></span></span><span style="display:flex;"><span><span style="color:#a31515"></span> -drive <span style="color:#00f">if</span>=none,id=vd1,file=$HOME/VM/ISO/9front.386.iso <span style="color:#a31515">\ | ||
| 1473 | </span></span></span><span style="display:flex;"><span><span style="color:#a31515"></span> -device scsi-cd,drive=vd1,bootindex=0 | ||
| 1474 | </span></span></code></pre></content:encoded> | ||
| 1475 | </item> | ||
| 1476 | |||
| 1477 | |||
| 1478 | |||
| 1479 | <item> | ||
| 1480 | <title>Cache busting in Hugo</title> | ||
| 1481 | <link>https://mitjafelicijan.com/cachebusting-in-hugo.html</link> | ||
| 1482 | <pubDate>Mon, 01 May 2023 12:00:00 +0200</pubDate> | ||
| 1483 | <guid>https://mitjafelicijan.com/cachebusting-in-hugo.html</guid> | ||
| 1484 | <description>{{ $cachebuster := delimit (shuffle (split (md5 &#34;6fab11c6669976d759d2992eff1dd5be&#34;) &#34;&#34; )) &#34;&#34; }}&lt;link rel=&#34;stylesheet&#34; href=&#34;/style.</description> | ||
| 1485 | <content:encoded><pre tabindex="0" style="background-color:#fff;"><code><span style="display:flex;"><span>{{ $cachebuster := delimit (shuffle (split (md5 &#34;6fab11c6669976d759d2992eff1dd5be&#34;) &#34;&#34; )) &#34;&#34; }} | ||
| 1486 | </span></span><span style="display:flex;"><span> | ||
| 1487 | </span></span><span style="display:flex;"><span>&lt;link rel=<span style="color:#a31515">&#34;stylesheet&#34;</span> href=<span style="color:#a31515">&#34;/style.css?v={{ $cachebuster }}&#34;</span>&gt; | ||
| 1488 | </span></span></code></pre><p>This <code>6fab11c6669976d759d2992eff1dd5be</code> can be random string you generate use. | ||
| 1489 | You can use whatever you want.</p> | ||
| 1490 | </content:encoded> | ||
| 1491 | </item> | ||
| 1492 | |||
| 1493 | |||
| 1494 | |||
| 1495 | |||
| 1496 | |||
| 1497 | |||
| 1498 | |||
| 1499 | |||
| 1500 | |||
| 1501 | |||
| 1502 | |||
| 1503 | |||
| 1504 | |||
| 1505 | |||
| 1506 | |||
| 1507 | |||
| 1508 | |||
| 1509 | |||
| 1510 | |||
| 1511 | |||
| 1512 | |||
| 1513 | |||
| 1514 | |||
| 1515 | |||
| 1516 | |||
| 1517 | |||
| 1518 | |||
| 1519 | |||
| 1520 | |||
| 1521 | |||
| 1522 | |||
| 1523 | |||
| 1524 | |||
| 1525 | |||
| 1526 | |||
| 1527 | |||
| 1528 | |||
| 1529 | |||
| 1530 | |||
| 1531 | |||
| 1532 | |||
| 1533 | |||
| 1534 | |||
| 1535 | |||
| 1536 | |||
| 1537 | |||
| 1538 | |||
| 1539 | |||
| 1540 | |||
| 1541 | |||
| 1542 | |||
| 1543 | |||
| 1544 | |||
| 1545 | |||
| 1546 | |||
| 1547 | |||
| 1548 | |||
| 1549 | |||
| 1550 | |||
| 1551 | |||
| 1552 | |||
| 1553 | |||
| 1554 | |||
| 1555 | |||
| 1556 | |||
| 1557 | |||
| 1558 | |||
| 1559 | |||
| 1560 | |||
| 1561 | |||
| 1562 | |||
| 1563 | |||
| 1564 | |||
| 1565 | |||
| 1566 | |||
| 1567 | |||
| 1568 | </channel> | ||
| 1569 | </rss> | ||
