Cheatsheets on J. Fernando Sánchezhttps://balkian.com/page/cheatsheet/Recent content in Cheatsheets on J. Fernando SánchezHugo -- gohugo.ioen-usEmacshttps://balkian.com/emacs/Mon, 01 Jan 0001 00:00:00 +0000https://balkian.com/emacs/<img src="https://balkian.com/img/emacs.png" alt="Featured image of post Emacs" /><h2 id="show-plain-text-version">Show plain text version </h2><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-lisp" data-lang="lisp"><span class="line"><span class="cl"><span class="p">(</span><span class="nv">font-lock-mode</span><span class="p">)</span> </span></span></code></pre></td></tr></table> </div> </div>Linuxhttps://balkian.com/linux/Mon, 01 Jan 0001 00:00:00 +0000https://balkian.com/linux/<img src="https://balkian.com/img/linux.png" alt="Featured image of post Linux" /><h2 id="black-screen-and-lightdm-doesnt-unlock">Black screen and LightDM doesn&rsquo;t unlock </h2><p>Add this to your /etc/lightdm/lightdm.conf file:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-cfg" data-lang="cfg"><span class="line"><span class="cl"><span class="k">[LightDM]</span> </span></span><span class="line"><span class="cl"><span class="na">logind-check-graphical</span><span class="o">=</span><span class="s">true</span> </span></span></code></pre></td></tr></table> </div> </div><p>##Edit previous commands</p> <p><code>fc</code> is a shell builtin to list and edit previous commands in an editor. In addition to editing a single line (which you can also do with <code>C-x C-e</code>), it also allows you to edit and run several lines at the same time. You use it like this:</p> <p>List previous commands</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ <span class="nb">fc</span> -l </span></span><span class="line"><span class="cl"><span class="m">10259</span> nvim deploy.sh </span></span><span class="line"><span class="cl">10260* <span class="nb">cd</span> .. </span></span><span class="line"><span class="cl">10261* nvim content/cheatsheet/linux.md </span></span><span class="line"><span class="cl"><span class="m">10262</span> <span class="nb">cd</span> </span></span></code></pre></td></tr></table> </div> </div><p>List commands with date (in zsh)</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ <span class="nb">fc</span> -ld </span></span><span class="line"><span class="cl">10260* 19:38 <span class="nb">cd</span> .. </span></span><span class="line"><span class="cl">10261* 19:38 nvim content/cheatsheet/linux.md </span></span><span class="line"><span class="cl"><span class="m">10262</span> 19:40 <span class="nb">cd</span> </span></span><span class="line"><span class="cl"><span class="m">10263</span> 19:40 <span class="nb">fc</span> -l </span></span></code></pre></td></tr></table> </div> </div><p>You can add the date too:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ <span class="nb">fc</span> -fld </span></span><span class="line"><span class="cl"><span class="m">10262</span> 1/10/2019 19:40 <span class="nb">cd</span> </span></span><span class="line"><span class="cl"><span class="m">10263</span> 1/10/2019 19:40 <span class="nb">fc</span> -l </span></span><span class="line"><span class="cl"><span class="m">10264</span> 1/10/2019 19:40 <span class="nb">fc</span> -ld </span></span></code></pre></td></tr></table> </div> </div><p>You can edit a range of commands</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ <span class="nb">fc</span> <span class="m">10262</span> <span class="m">10264</span> </span></span></code></pre></td></tr></table> </div> </div><p>The range can be relative to the current position, so the previous command is equivalent to:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ <span class="nb">fc</span> -3 -1 </span></span></code></pre></td></tr></table> </div> </div><p>If you save and exit, all commands are executed as a script, and it will be added to your history.</p> <p>Source: <a class="link" href="https://shapeshed.com/unix-fc/" target="_blank" rel="noopener" >https://shapeshed.com/unix-fc/</a></p> <h2 id="prevent-logoff-from-killing-tmux-sessions">Prevent logoff from killing tmux sessions </h2><p>Lately I&rsquo;ve noticed that logging out of i3, intentionally or when i3 fails, would also kill any tmux or emacs sessions. This is extremely annoying.</p> <p>This is caused by a new default in logind (systemd&rsquo;s login) to kill user process on logoff. You can revert this setting in your logind.conf (<code>/etc/systemd/logind.conf</code>):</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-cfg" data-lang="cfg"><span class="line"><span class="cl"><span class="na">KillUserProcesses</span><span class="o">=</span><span class="s">no</span> </span></span></code></pre></td></tr></table> </div> </div><p>Or only for a specific process (e.g., tmux):</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">systemd-run --scope --user tmux </span></span></code></pre></td></tr></table> </div> </div><p>Source: <a class="link" href="https://unix.stackexchange.com/questions/490267/prevent-logoff-from-killing-tmux-session" target="_blank" rel="noopener" >https://unix.stackexchange.com/questions/490267/prevent-logoff-from-killing-tmux-session</a></p> <h2 id="upload-a-temporary-file">Upload a temporary file </h2><p>Sometimes you just need to copy/paste a file from a server, and copying from the terminal can be a hassle. These two services are command-line &ldquo;pastebins&rdquo; just one curl away:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span><span class="lnt">7 </span><span class="lnt">8 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">&lt;command&gt; <span class="p">|</span> curl -F <span class="s1">&#39;sprunge=&lt;-&#39;</span> http://sprunge.us </span></span><span class="line"><span class="cl"><span class="c1"># OR</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">&lt;command&gt; 2&gt;<span class="p">&amp;</span><span class="m">1</span> <span class="p">|</span> curl -F <span class="s1">&#39;f:1=&lt;-&#39;</span> ix.io </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># OR</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">&lt;command&gt; <span class="p">|</span> curl -F<span class="s2">&#34;file=@-&#34;</span> https://ttm.sh </span></span></code></pre></td></tr></table> </div> </div><h1 id="install-fortinet-sslvpn-support-for-networkmanager">Install Fortinet SSLVPN support for NetworkManager </h1><p>UPM (Universidad Politécnica de Madrid) uses a propriatary VPN solution. The instructions for GNU/Linux on their website involve downloading a specific client (<code>.tar.gz</code>) and manually running it. That works, but it is kind of a hassle. A much more convenient alternative is installing this NetworkManager plugin:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">pacman -Sy networkmanager-fortisslvpn </span></span><span class="line"><span class="cl"><span class="c1"># Or apt get install networkmanager-fortisslvpn </span> </span></span></code></pre></td></tr></table> </div> </div><p>Now you can simply add a new VPN connection in NetworkManager and manage it as you would any other connection.</p>Pythonhttps://balkian.com/python/Mon, 01 Jan 0001 00:00:00 +0000https://balkian.com/python/<img src="https://balkian.com/img/python.png" alt="Featured image of post Python" /><h2 id="interesting-libraries">Interesting libraries </h2><h3 id="tqdm"><a class="link" href="https://github.com/tqdm/tqdm" target="_blank" rel="noopener" >TQDM</a> </h3><p>From tqdm&rsquo;s github repository:</p> <blockquote> <p>tqdm means &ldquo;progress&rdquo; in Arabic (taqadum, تقدّم) and an abbreviation for &ldquo;I love you so much&rdquo; in Spanish (te quiero demasiado).</p></blockquote> <p><img src="https://raw.githubusercontent.com/tqdm/tqdm/master/images/tqdm.gif" loading="lazy" alt="TQDM in action" ></p> <h2 id="tools">Tools </h2><h3 id="uv"><a class="link" href="https://github.com/astral-sh/uv" target="_blank" rel="noopener" >uv</a> </h3><p>🚀 A single tool to replace pip, pip-tools, pipx, poetry, pyenv, twine, virtualenv, and more. ⚡️ 10-100x faster than pip.</p> <ul> <li>Provides comprehensive project management, with a universal lockfile.</li> <li>Runs scripts, with support for inline dependency metadata.</li> <li>Installs and manages Python versions.</li> <li>Runs and installs tools published as Python packages.</li> <li>Includes a pip-compatible interface for a performance boost with a familiar CLI.</li> <li>Supports Cargo-style workspaces for scalable projects.</li> <li>Disk-space efficient, with a global cache for dependency deduplication.</li> <li>Installable without Rust or Python via curl or pip.</li> <li>Supports macOS, Linux, and Windows.</li> </ul>Raspberry Pihttps://balkian.com/raspberry-pi/Mon, 01 Jan 0001 00:00:00 +0000https://balkian.com/raspberry-pi/<img src="https://balkian.com/img/rpi.png" alt="Featured image of post Raspberry Pi" /><h2 id="hdmi-flickering">HDMI flickering </h2><p>Avoid HDMI flickering/intermittent blanking on RPI with a 1400x1050 VGA monitor.</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="n">hdmi_drive</span><span class="o">=</span><span class="mi">2</span> </span></span><span class="line"><span class="cl"> <span class="n">hdmi_group</span><span class="o">=</span><span class="mi">2</span> </span></span><span class="line"><span class="cl"> <span class="n">hdmi_mode</span><span class="o">=</span><span class="mi">42</span> </span></span><span class="line"><span class="cl"> <span class="n">disable_overscan</span><span class="o">=</span><span class="mi">1</span> </span></span><span class="line"><span class="cl"> <span class="n">config_hdmi_boost</span><span class="o">=</span><span class="mi">7</span> </span></span></code></pre></td></tr></table> </div> </div>