<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>blog.masoko.net</title>
    <description>My Blog and Notes</description>
    <link>/</link>
    <atom:link href="/sitemap.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Fri, 26 Jun 2026 19:01:55 +0000</pubDate>
    <lastBuildDate>Fri, 26 Jun 2026 19:01:55 +0000</lastBuildDate>
    <generator>Jekyll v3.10.0</generator>
    
      <item>
        <title>Setting Up WireGuard VPN on MikroTik (Multi-Platform Remote Access Guide)</title>
        <description>&lt;p&gt;Remote access is a cornerstone of any robust home lab or small business network. While there are many VPN flavors out there, WireGuard has quickly become the gold standard due to its incredible speed, lightweight footprint, and cryptographic security.&lt;/p&gt;

&lt;p&gt;If you run a MikroTik router (RouterOS v7+), you have a powerful enterprise-grade WireGuard server sitting right in your living room. In this article, we’ll walk through setting up WireGuard on your MikroTik router and configuring clients for both Android and Windows 11.&lt;/p&gt;

&lt;h2 id=&quot;why-wireguard-on-mikrotik&quot;&gt;Why WireGuard on MikroTik?&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Kernel-Level Speed:&lt;/strong&gt; Unlike OpenVPN, which can bottleneck weaker router CPUs, WireGuard runs directly in the RouterOS kernel, maximizing your throughput.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Silence is Golden:&lt;/strong&gt; WireGuard does not respond to unauthenticated packets. To a port scanner on the internet, your VPN port looks completely closed.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Roaming Support:&lt;/strong&gt; If your phone switches from Wi-Fi to 4G/5G, the WireGuard connection transitions instantly without dropping your session.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;phase-1-configuring-the-mikrotik-server&quot;&gt;Phase 1: Configuring the MikroTik Server&lt;/h2&gt;

&lt;p&gt;Every WireGuard topology relies on a public/private key exchange. Think of it this way: your router and your phone will each generate their own unique key pair, and then they will swap public keys to trust one another.&lt;/p&gt;

&lt;h3 id=&quot;1-create-the-wireguard-interface&quot;&gt;1. Create the WireGuard Interface&lt;/h3&gt;
&lt;p&gt;Open Winbox and navigate to &lt;strong&gt;WireGuard&lt;/strong&gt; from the left menu. Click the &lt;strong&gt;+&lt;/strong&gt; (Add) button.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Name:&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wireguard1&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Listen Port:&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;13231&lt;/code&gt; (Default)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Click &lt;strong&gt;Apply&lt;/strong&gt;. RouterOS will instantly generate your unique Private Key and Public Key. Copy the Public Key somewhere safe; you will need it for the clients.&lt;/p&gt;

&lt;h3 id=&quot;2-assign-an-ip-subnet-to-the-vpn&quot;&gt;2. Assign an IP Subnet to the VPN&lt;/h3&gt;
&lt;p&gt;Go to &lt;strong&gt;IP -&amp;gt; Addresses -&amp;gt; + (Add)&lt;/strong&gt;. We need a dedicated internal subnet for our VPN clients.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Address:&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;10.0.0.1/24&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Network:&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;10.0.0.0&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Interface:&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wireguard1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;3-open-the-firewall-port&quot;&gt;3. Open the Firewall Port&lt;/h3&gt;
&lt;p&gt;Go to &lt;strong&gt;IP -&amp;gt; Firewall -&amp;gt; Filter Rules -&amp;gt; + (Add)&lt;/strong&gt;. WireGuard uses UDP, so we must allow incoming traffic on our listening port.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Chain:&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;input&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Protocol:&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;udp&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Dst. Port:&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;13231&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Action:&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;accept&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Crucial:&lt;/strong&gt; Drag this rule to the very top of your Firewall input list so the traffic isn’t dropped by default drop rules.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;phase-2-connecting-an-android-device&quot;&gt;Phase 2: Connecting an Android Device&lt;/h2&gt;

&lt;p&gt;On mobile devices, configuration is a breeze thanks to visual key exchanges.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Download the official &lt;strong&gt;WireGuard&lt;/strong&gt; app from the Google Play Store.&lt;/li&gt;
  &lt;li&gt;Tap the blue &lt;strong&gt;+&lt;/strong&gt; (Plus) icon and select &lt;strong&gt;Create from scratch&lt;/strong&gt;.&lt;/li&gt;
  &lt;li&gt;Under the &lt;strong&gt;Interface&lt;/strong&gt; section, give it a name (e.g., &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HomeVPN&lt;/code&gt;). You will see a pre-generated Public key. &lt;em&gt;Copy this key—you need to add it to MikroTik.&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Fill in the Interface details:
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;Addresses:&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;10.0.0.2/24&lt;/code&gt; (This is your phone’s fixed VPN IP).&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;DNS Servers:&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;192.168.88.1&lt;/code&gt; (Your MikroTik’s local IP).&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Tap &lt;strong&gt;Add Peer&lt;/strong&gt; at the bottom:
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;Public Key:&lt;/strong&gt; Paste the MikroTik’s Public Key here.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Endpoint:&lt;/strong&gt; Your public home IP address or MikroTik DDNS, followed by the port (e.g., &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;yourhome.sn.mynetname.net:13231&lt;/code&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Allowed IPs:&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0.0.0.0/0&lt;/code&gt; (Redirects all mobile internet traffic securely through your home) OR &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;192.168.88.0/24&lt;/code&gt; (Only routes traffic intended for home lab devices).&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Back on MikroTik:&lt;/strong&gt; Go to the &lt;strong&gt;Peers&lt;/strong&gt; tab -&amp;gt; &lt;strong&gt;+&lt;/strong&gt;. Select &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wireguard1&lt;/code&gt;, paste your Phone’s Public Key, and set Allowed Address to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;10.0.0.2/32&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Save both sides, toggle the switch on your phone, and you are connected!&lt;/li&gt;
&lt;/ol&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;phase-3-connecting-a-windows-11-pc&quot;&gt;Phase 3: Connecting a Windows 11 PC&lt;/h2&gt;

&lt;p&gt;Since you can’t easily scan QR codes on a desktop, Windows configuration is done via a simple text configuration file (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.conf&lt;/code&gt;).&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Download and install WireGuard for Windows from &lt;a href=&quot;https://www.wireguard.com&quot;&gt;wireguard.com&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Click the arrow next to &lt;strong&gt;Add Tunnel&lt;/strong&gt; and choose &lt;strong&gt;Add empty tunnel…&lt;/strong&gt;.&lt;/li&gt;
  &lt;li&gt;A window will pop up showing a fresh Public Key. Copy this key and register it in &lt;strong&gt;MikroTik -&amp;gt; Peers&lt;/strong&gt; with the IP &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;10.0.0.3/32&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Overwrite the text box in the Windows client with the following blueprint configuration:&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&quot;language-ini highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nn&quot;&gt;[Interface]&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;PrivateKey&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;[YOUR_WINDOWS_PRIVATE_KEY_DO_NOT_TOUCH]&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;Address&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;10.0.0.3/24&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;DNS&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;192.168.88.1&lt;/span&gt;

&lt;span class=&quot;nn&quot;&gt;[Peer]&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;PublicKey&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;[PASTE_YOUR_MIKROTIK_PUBLIC_KEY_HERE]&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;Endpoint&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;[YOUR_PUBLIC_IP_OR_DDNS]:13231&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;AllowedIPs&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;192.168.88.0/24&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;PersistentKeepalive&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;25&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;pro-tip-split-tunneling-vs-full-tunneling-on-windows&quot;&gt;Pro-Tip: Split Tunneling vs. Full Tunneling on Windows&lt;/h3&gt;
&lt;p&gt;For desktops and laptops, it is usually best to use &lt;strong&gt;Split Tunneling&lt;/strong&gt; by setting &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AllowedIPs = 192.168.88.0/24&lt;/code&gt;. This means your regular PC gaming, web surfing, and video streaming happen over your local network, while &lt;em&gt;only&lt;/em&gt; requests destined for your home lab servers get routed through the VPN tunnel.&lt;/p&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PersistentKeepalive = 25&lt;/code&gt; line ensures that your PC sends a tiny blank packet every 25 seconds, preventing aggressive cellular or public Wi-Fi firewalls from closing your idle connection.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;troubleshooting-why-am-i-getting-0-b-received&quot;&gt;Troubleshooting: Why am I getting 0 B Received?&lt;/h2&gt;

&lt;p&gt;If your client says “Active” but the Transfer: Received counter sits stubbornly at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0 B&lt;/code&gt;, your tunnel is failing its cryptographic handshake. Check these three things:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Key Swap Mishap:&lt;/strong&gt; Double-check that you didn’t accidentally paste the router’s key into the router’s peer settings. The router must hold the client’s key, and the client must hold the router’s key.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;IP Subnet Mismatch:&lt;/strong&gt; Ensure the client IP (e.g., &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;10.0.0.3&lt;/code&gt;) matches the specific &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/32&lt;/code&gt; allowed address you assigned to that peer inside MikroTik.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;CGNAT / Dynamic IP:&lt;/strong&gt; If your ISP hides your router behind a CGNAT (Carrier-Grade NAT), a direct WireGuard handshake won’t work without a middleman server. Use MikroTik’s built-in Cloud DDNS (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/ip/cloud&lt;/code&gt;) to track dynamic IPs effortlessly.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;wrap-up&quot;&gt;Wrap Up&lt;/h2&gt;

&lt;p&gt;Once implemented, WireGuard provides a seamless, “always-on” feel. You can map network drives, access your Home Assistant dashboards, or SSH into your Linux hosts from anywhere in the world, knowing your perimeter remains completely secure.&lt;/p&gt;
</description>
        <pubDate>Thu, 25 Jun 2026 00:00:00 +0000</pubDate>
        <link>/linux/Setting-Up-WireGuard-VPN-on-MikroTik/</link>
        <guid isPermaLink="true">/linux/Setting-Up-WireGuard-VPN-on-MikroTik/</guid>
        
        
        <category>linux</category>
        
      </item>
    
      <item>
        <title>Squeezelite Service Not Mixing with Browser Audio (PipeWire/PulseAudio Fix)</title>
        <description>&lt;p&gt;The Squeezelite audio player is a wonderful headless solution, but getting it to run as a reliable, shareable background service on modern Linux distributions (like Ubuntu, Debian, or Fedora, especially those using PipeWire) can be a nightmare.&lt;/p&gt;

&lt;p&gt;This post documents a common, frustrating error and the simple fix that allows Squeezelite to play music alongside other applications, like your browser (YouTube, Spotify Web, etc.).&lt;/p&gt;

&lt;h2 id=&quot;the-problem-the-audio-host-is-down-loop&quot;&gt;The Problem: The Audio “Host is Down” Loop&lt;/h2&gt;

&lt;p&gt;When setting up Squeezelite as a persistent &lt;strong&gt;systemd service&lt;/strong&gt; (often running as a low-privilege user like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;daemon&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;squeezelite&lt;/code&gt;), the service either failed to start or immediately grabbed the sound card exclusively.&lt;/p&gt;

&lt;h3 id=&quot;the-error-message&quot;&gt;The Error Message&lt;/h3&gt;

&lt;p&gt;The core issue was demonstrated by this error log, which repeats when using devices like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;default&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pulse&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[16:04:06.843393] test_open:281 playback open error: Host is down
[16:04:06.843416] output_init_common:401 unable to open output device: default
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;why-this-happens&quot;&gt;Why This Happens&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Exclusive Access:&lt;/strong&gt; When running Squeezelite with a raw hardware device (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-o hw:CARD=PCH,DEV=0&lt;/code&gt;), the application takes &lt;strong&gt;exclusive control&lt;/strong&gt; of the sound card, blocking the browser.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Environment Conflict:&lt;/strong&gt; When attempting to use the mixing devices (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-o default&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-o pulse&lt;/code&gt;), the service fails. This is because &lt;strong&gt;System Services&lt;/strong&gt; run in a minimal environment and &lt;strong&gt;cannot reliably connect&lt;/strong&gt; to the &lt;strong&gt;User Session PipeWire/PulseAudio server&lt;/strong&gt; that manages all desktop audio (including your browser). It’s a fundamental conflict between a system process and a user-level audio mixer. The “Host is down” error simply means the connection to the mixer server was refused or the socket was not found.&lt;/li&gt;
&lt;/ol&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;-the-easy-fix-switch-to-a-user-autostart-application&quot;&gt;✅ The Easy Fix: Switch to a User Autostart Application&lt;/h2&gt;

&lt;p&gt;The solution is to stop treating Squeezelite as a low-level “system” component and instead run it as a normal “user” application that starts &lt;strong&gt;after&lt;/strong&gt; your graphical session (and PipeWire) is fully loaded. This is the only way to guarantee it connects to the active audio mixer.&lt;/p&gt;

&lt;p&gt;This method uses a standard &lt;strong&gt;Desktop Entry (.desktop) file&lt;/strong&gt;, which works on most Linux desktop environments (GNOME, KDE, XFCE, Cinnamon, etc.).&lt;/p&gt;

&lt;h3 id=&quot;step-1-disable-the-broken-system-service&quot;&gt;Step 1: Disable the Broken System Service&lt;/h3&gt;

&lt;p&gt;Stop and permanently disable the old service file to prevent conflicts.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Stop the running service:&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;systemctl stop squeezelite.service

&lt;span class=&quot;c&quot;&gt;# Disable the service so it doesn&apos;t try to start on the next reboot:&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;systemctl disable squeezelite.service
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;step-2-create-the-autostart-file&quot;&gt;Step 2: Create the Autostart File&lt;/h3&gt;

&lt;p&gt;We create a configuration file that tells your desktop environment to launch Squeezelite with the correct, shareable device name when you log in.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Create the directory&lt;/strong&gt; (if needed):&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; ~/.config/autostart
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Create the autostart file&lt;/strong&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;squeezelite.desktop&lt;/code&gt;):&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;nano ~/.config/autostart/squeezelite.desktop
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Paste and save this content:&lt;/strong&gt;&lt;/p&gt;

    &lt;div class=&quot;language-ini highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nn&quot;&gt;[Desktop Entry]&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;Name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Squeezelite Player&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;Comment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Starts Squeezelite audio player on user login&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# Key Fix: Use the &apos;pipewire&apos; audio output device
&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;Exec&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/usr/bin/squeezelite -n mini-pc -o pipewire&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;Terminal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;Type&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Application&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;X-GNOME-Autostart-enabled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;&lt;em&gt;If &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pipewire&lt;/code&gt; doesn’t work, try &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-o default&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-o pulse&lt;/code&gt; here, as the autostart environment is much more forgiving than the system service environment.&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;step-3-log-in-and-enjoy-simultaneous-audio&quot;&gt;Step 3: Log In and Enjoy Simultaneous Audio&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Log out&lt;/strong&gt; of your desktop session.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Log back in.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Squeezelite will now start automatically in the background as your user, correctly connecting to the &lt;strong&gt;PipeWire&lt;/strong&gt; mixing server. You can now stream music to Squeezelite while simultaneously watching a YouTube video or listening to other audio in your browser!&lt;/p&gt;
</description>
        <pubDate>Sun, 12 Oct 2025 00:00:00 +0000</pubDate>
        <link>/linux/sqeezelite-wont-mix-with-user-audio-copy/</link>
        <guid isPermaLink="true">/linux/sqeezelite-wont-mix-with-user-audio-copy/</guid>
        
        
        <category>linux</category>
        
      </item>
    
      <item>
        <title>How I like my Ubuntu</title>
        <description>&lt;h1&gt;Widgets and Apps I install immediately after Ubuntu&lt;/h1&gt;

&lt;h2&gt;Extentions:&lt;/h2&gt;

&lt;p&gt;Dash to Panel - https://extensions.gnome.org/extension/1160/dash-to-panel/&lt;/p&gt;

&lt;p&gt;Desktop Widgets (Desktop Clock) - https://extensions.gnome.org/extension/5156/desktop-clock/&lt;/p&gt;

&lt;p&gt;ArcMenu - https://extensions.gnome.org/extension/3628/arcmenu/&lt;/p&gt;

&lt;h2&gt;Apps:&lt;/h2&gt;

&lt;p&gt;Variety - Desktop wallpaper downloader and changer&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sudo apt install variety
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;AppImageLauncher - https://github.com/TheAssassin/AppImageLauncher&lt;/p&gt;
</description>
        <pubDate>Fri, 10 Oct 2025 00:00:00 +0000</pubDate>
        <link>/linux/how-i-like-my-ubuntu/</link>
        <guid isPermaLink="true">/linux/how-i-like-my-ubuntu/</guid>
        
        
        <category>linux</category>
        
      </item>
    
      <item>
        <title>Rename bluetooth device in Ubuntu</title>
        <description>&lt;p&gt;Use bt-device (part of the bluez-tools package).&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sudo apt install bt-device
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Get a list of paired devices:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;bt-device -l
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;To set the new alias:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;bt-device --set macaddress|name Alias &quot;New Name&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;ie:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;bt-device --set S530 Alias &quot;S530 Blue&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
        <pubDate>Tue, 18 Oct 2022 00:00:00 +0000</pubDate>
        <link>/linux/ubuntu-rename-bluetooth-device-copy/</link>
        <guid isPermaLink="true">/linux/ubuntu-rename-bluetooth-device-copy/</guid>
        
        
        <category>linux</category>
        
      </item>
    
      <item>
        <title>Set git origin to remember credentials</title>
        <description>&lt;p&gt;Set in your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.bashrc&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.zshrc&lt;/code&gt; file:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;export username=&quot;git-hub-token&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Then run the command below to save your credentials&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git remote set-url origin https://username:$username@github.com/username/repo-name.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
        <pubDate>Tue, 08 Feb 2022 00:00:00 +0000</pubDate>
        <link>/linux/set-git-origin/</link>
        <guid isPermaLink="true">/linux/set-git-origin/</guid>
        
        
        <category>linux</category>
        
      </item>
    
      <item>
        <title>How to mount Samba share on boot</title>
        <description>&lt;p&gt;To mount a samba share when Ubuntu boots you need to add a line to your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/fstab&lt;/code&gt; file.
You’ll have to update the path to your samba share, local mount folder and your samba credentials.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;//remote/path/to/samba/share /local/mount/folder cifs username=your-user-name-here,password=your-password-here,rw,file_mode=0777,dir_mode=0777       0       0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After you update your fstab file you need to mount the newly added record, you can do that with the mount command below&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;mount -a
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
        <pubDate>Tue, 08 Feb 2022 00:00:00 +0000</pubDate>
        <link>/linux/mount-sama-share-fstab/</link>
        <guid isPermaLink="true">/linux/mount-sama-share-fstab/</guid>
        
        
        <category>linux</category>
        
      </item>
    
      <item>
        <title>Useful CLI tools</title>
        <description>&lt;h1 id=&quot;github-repos-for-some-usefull-cli-tools&quot;&gt;Github repos for some usefull CLI tools&lt;/h1&gt;
&lt;h2 id=&quot;fd&quot;&gt;fd&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/sharkdp/fd/&quot; target=&quot;_blank&quot;&gt;https://github.com/sharkdp/fd/&lt;/a&gt;
&lt;img src=&quot;/static/img/fd-screenshot.png&quot; alt=&quot;fd screenshot&quot; /&gt;&lt;br /&gt;
fd is a program to find entries in your filesystem. It is a simple, fast and user-friendly alternative to find. While it does not aim to support all of find’s powerful functionality, it provides sensible (opinionated) defaults for a majority of use cases.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;fd-find
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Note that the binary is called &lt;strong&gt;fdfind&lt;/strong&gt; as the binary name fd is already used by another package. It is recommended that after installation, you add a link to fd by executing command &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ln -s $(which fdfind) ~/.local/bin/fd&lt;/code&gt;
***&lt;/p&gt;
&lt;h2 id=&quot;jq&quot;&gt;jq&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/stedolan/jq&quot; target=&quot;_blank&quot;&gt;https://github.com/stedolan/jq&lt;/a&gt;
&lt;img src=&quot;/static/img/jq-screenshot.png&quot; alt=&quot;jq screenshot&quot; /&gt;&lt;br /&gt;
jq is like sed for JSON data - you can use it to slice and filter and map and transform structured data with the same ease that sed, awk, grep and friends let you play with text.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;jq
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;bat&quot;&gt;bat&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/sharkdp/bat&quot; target=&quot;_blank&quot;&gt;https://github.com/sharkdp/bat&lt;/a&gt;
&lt;img src=&quot;/static/img/bat-screenshot.png&quot; alt=&quot;bat screenshot&quot; /&gt;&lt;br /&gt;
bat supports syntax highlighting for a large number of programming and markup languages.&lt;/p&gt;

&lt;p&gt;bat communicates with git to show modifications with respect to the index (see left side bar):&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;bat
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Important: If you install bat this way, please note that the executable may be installed as &lt;strong&gt;batcat&lt;/strong&gt; instead of bat (due to a name clash with another package). You can set up a bat -&amp;gt; batcat symlink or alias to prevent any issues that may come up because of this and to be consistent with other distributions:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; ~/.local/bin
&lt;span class=&quot;nb&quot;&gt;ln&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-s&lt;/span&gt; /usr/bin/batcat ~/.local/bin/bat
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;fff&quot;&gt;fff&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dylanaraps/fff&quot; target=&quot;_blank&quot;&gt;https://github.com/dylanaraps/fff&lt;/a&gt;
&lt;img src=&quot;/static/img/fff-screenshot.png&quot; alt=&quot;fff screenshot&quot; /&gt;&lt;br /&gt;
A simple file manager written in bash.&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git clone https://github.com/dylanaraps/fff
&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;fff
make &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;CD on Exit:&lt;br /&gt;
To enable CD on Exit in Bash or Zsh, add this to your .bashrc, .zshrc or equivalent.&lt;br /&gt;
Run ‘fff’ with ‘f’ or whatever you decide to name the function.&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;f&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
fff &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$@&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cat&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;XDG_CACHE_HOME&lt;/span&gt;:&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;HOME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/.cache&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/fff/.fff_d&quot;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;duf&quot;&gt;duf&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/muesli/duf&quot; target=&quot;_blank&quot;&gt;https://github.com/muesli/duf&lt;/a&gt;
&lt;img src=&quot;/static/img/duf-screenshot.png&quot; alt=&quot;duf screenshot&quot; /&gt;&lt;br /&gt;
Disk Usage/Free Utility (Linux, BSD, macOS &amp;amp; Windows)&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;duf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;exa&quot;&gt;exa&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ogham/exa&quot; target=&quot;_blank&quot;&gt;https://github.com/ogham/exa&lt;/a&gt;
&lt;img src=&quot;/static/img/exa-screenshot.png&quot; alt=&quot;exa screenshot&quot; /&gt;&lt;br /&gt;
exa is a modern replacement for the venerable file-listing command-line program ls that ships with Unix and Linux operating systems, giving it more features and better defaults. It uses colours to distinguish file types and metadata. It knows about symlinks, extended attributes, and Git. And it’s small, fast, and just one single binary.&lt;/p&gt;

&lt;p&gt;By deliberately making some decisions differently, exa attempts to be a more featureful, more user-friendly version of ls.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;exa
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;ohmyzsh&quot;&gt;ohmyzsh&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ohmyzsh/ohmyzsh/&quot; target=&quot;_blank&quot;&gt;https://github.com/ohmyzsh/ohmyzsh/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Oh My Zsh is an open source, community-driven framework for managing your zsh configuration.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sh &lt;span class=&quot;nt&quot;&gt;-c&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;curl &lt;span class=&quot;nt&quot;&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Before using ohmyzsh you need to make sure that zsh is installed:&lt;br /&gt;
&lt;a href=&quot;https://github.com/ohmyzsh/ohmyzsh/wiki/Installing-ZSH&quot; target=&quot;_blank&quot;&gt;zsh installation instructions&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;zsh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Plugins for ohmyzsh:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;plugins=(git macos common-aliases dirhistory zsh-autosuggestions zsh-syntax-highlighting)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;All of these plugins come with ohmyzsh and they only need to be included in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.zshrc&lt;/code&gt; except &lt;strong&gt;zsh-syntax-highlighting&lt;/strong&gt; and &lt;strong&gt;zsh-autosuggestions&lt;/strong&gt;, which needs to be installed additionally with the commands below:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git clone https://github.com/zsh-users/zsh-syntax-highlighting.git &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ZSH_CUSTOM&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:-&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;~/.oh-my-zsh/custom&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;/plugins/zsh-syntax-highlighting
git clone https://github.com/zsh-users/zsh-autosuggestions &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ZSH_CUSTOM&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:-&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;~/.oh-my-zsh/custom&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;/plugins/zsh-autosuggestions
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;ohmyzsh themes I use:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ZSH_THEME=&quot;gallois&quot;  
ZSH_THEME=&quot;af-magic&quot;  
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;hr /&gt;
&lt;h2 id=&quot;btop&quot;&gt;btop&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/aristocratos/btop&quot; target=&quot;_blank&quot;&gt;https://github.com/aristocratos/btop&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/static/img/btop-screenshot.png&quot; alt=&quot;btop screenshot&quot; /&gt;&lt;br /&gt;
Resource monitor that shows usage and stats for processor, memory, disks, network and processes.&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;snap &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;btop
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;hr /&gt;
&lt;h2 id=&quot;httpie&quot;&gt;HTTPie&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/httpie/httpie&quot; target=&quot;_blank&quot;&gt;https://github.com/httpie/httpie&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;HTTPie is a command-line HTTP client. Its goal is to make CLI interaction with web services as human-friendly as possible. HTTPie is designed for testing, debugging, and generally interacting with APIs &amp;amp; HTTP servers. The http &amp;amp; https commands allow for creating and sending arbitrary HTTP requests. They use simple and natural syntax and provide formatted and colorized output.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;httpie
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
        <pubDate>Wed, 01 Dec 2021 00:00:00 +0000</pubDate>
        <link>/ubuntu/Useful-cli-tools/</link>
        <guid isPermaLink="true">/ubuntu/Useful-cli-tools/</guid>
        
        
        <category>ubuntu</category>
        
      </item>
    
      <item>
        <title>Ubuntu Customizations CLI</title>
        <description>&lt;h1 id=&quot;how-do-i-enable-minimize-on-click-on-ubuntu-dock&quot;&gt;How do I enable ‘minimize on click’ on Ubuntu dock&lt;/h1&gt;

&lt;p&gt;Open Terminal and run&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gsettings set org.gnome.shell.extensions.dash-to-dock click-action &apos;minimize&apos;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;To revert to the default option, simply run&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gsettings reset org.gnome.shell.extensions.dash-to-dock click-action&lt;/code&gt;&lt;/p&gt;

&lt;h1 id=&quot;how-to-make-dock-background-80-transparent-in-ubuntu&quot;&gt;How to make dock background 80% transparent in Ubuntu&lt;/h1&gt;

&lt;p&gt;First enable custom colors:&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gsettings set org.gnome.shell.extensions.dash-to-dock transparency-mode &apos;FIXED&apos;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then, to set transparency to 80%, issue the command&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gsettings set org.gnome.shell.extensions.dash-to-dock background-opacity 0.2&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Change 0.0 to any number between 0 and 1.&lt;/p&gt;

&lt;p&gt;To reset to the default setting:&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gsettings reset org.gnome.shell.extensions.dash-to-dock background-opacity&lt;/code&gt;&lt;/p&gt;

&lt;h1 id=&quot;make-file-manager-always-show-full-path-not-only-with-ctrl--l&quot;&gt;Make file manager always show full path (not only with ctrl + l)&lt;/h1&gt;
&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gsettings set org.gnome.nautilus.preferences always-use-location-entry true&lt;/code&gt;&lt;/p&gt;

&lt;h1 id=&quot;create-a-wallpaper-slideshow-using-bash-script-and-cron&quot;&gt;Create a wallpaper slideshow using bash script and cron&lt;/h1&gt;
&lt;p&gt;Save this script as a bash file, update the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DIR&lt;/code&gt; variable to point to your photo collection and schedule it with a cronjob.&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;#!/usr/bin/env bash

# Update the DIR variable to point to your photos

DIR=&quot;/home/masoko/Pictures/wallpapers/reddit&quot;
PIC=$(ls $DIR/* | shuf -n1)

RUID=$(who | awk &apos;FNR == 1 {print $1}&apos;)
RUSER_UID=$(id -u ${RUID})
sudo -u ${RUID} DBUS_SESSION_BUS_ADDRESS=&quot;unix:path=/run/user/${RUSER_UID}/bus&quot; gsettings set org.gnome.desktop.background picture-uri &quot;file://$PIC&quot;
exit
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
        <pubDate>Mon, 04 Oct 2021 00:00:00 +0000</pubDate>
        <link>/ubuntu/Ubuntu-Customizations-CLI/</link>
        <guid isPermaLink="true">/ubuntu/Ubuntu-Customizations-CLI/</guid>
        
        
        <category>ubuntu</category>
        
      </item>
    
      <item>
        <title>How to ssh using a certificate (not password)</title>
        <description>&lt;ol&gt;
  &lt;li&gt;Generate the certificate on the machine you are going to login from:
    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ssh-keygen
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;Check the certificate to make sure it was generated properly:
    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;cat ~/.ssh/id_rsa.pub
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;Copy the certificate to the remote machine:
    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ssh-copy-id user@host
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;p&gt;When you execute ssh-copy-id you’ll be asked for the password of the remote host.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;
</description>
        <pubDate>Thu, 15 Apr 2021 00:00:00 +0000</pubDate>
        <link>/linux/ssh-without-password/</link>
        <guid isPermaLink="true">/linux/ssh-without-password/</guid>
        
        
        <category>linux</category>
        
      </item>
    
      <item>
        <title>How to Install Mosquitto Broker on Raspberry Pi</title>
        <description>&lt;h1 id=&quot;how-to-install-mosquitto-broker-on-raspberry-pi&quot;&gt;How to Install Mosquitto Broker on Raspberry Pi&lt;/h1&gt;

&lt;ol&gt;
  &lt;li&gt;Install the mosquitto broker with the command below:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;sudo apt install -y mosquitto mosquitto-clients&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Create a password file (you’ll be promted to enter the password).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mosquitto_passwd -c passwordfile user&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;move the password file to /etc/mosquitto&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sudo mv passwordfile /etc/mosquitto/&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Update mosquitto broker config so it uses the created password file.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Create a custom config file in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/mosquitto/conf.d&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sudo nano /etc/mosquitto/conf.d/config.cfg&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Here is the configuration I am using and it works fine with Home Assistant:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;user mosquitto
max_queued_messages 200
listener 1883 0.0.0.0
allow_zero_length_clientid true
allow_duplicate_messages false 
autosave_interval 900
autosave_on_changes false
persistence true
persistence_file mosquitto.db
allow_anonymous false
password_file /etc/mosquitto/passwordfile
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here is how to check mosquitto logs.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sudo cat /var/log/mosquitto/mosquitto.log&lt;/code&gt;&lt;/p&gt;
</description>
        <pubDate>Mon, 12 Apr 2021 00:00:00 +0000</pubDate>
        <link>/raspberry-pi/Install-MQTT-Broker/</link>
        <guid isPermaLink="true">/raspberry-pi/Install-MQTT-Broker/</guid>
        
        
        <category>raspberry-pi</category>
        
      </item>
    
      <item>
        <title>Install LetsEncrypt Certificates</title>
        <description>&lt;p&gt;&lt;img src=&quot;/static/img/letsencrypt.png&quot; alt=&quot;LetsEncrypt&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;in-this-article-ill-show-you-how-i-installed-letsencrypt-certificate-for-my-home-assistant-instance-that-is-behind-a-nginx-reverse-proxy&quot;&gt;In this article I’ll show you how I installed LetsEncrypt certificate for my home-assistant instance that is behind a nginx reverse proxy.&lt;/h1&gt;

&lt;ol&gt;
  &lt;li&gt;We need to install Let’s Encrypt:
    &lt;pre&gt;$sudo apt-get install certbot&lt;/pre&gt;
  &lt;/li&gt;
  &lt;li&gt;Once LetsEncrypt is installed we have to generate the certificate:
    &lt;pre&gt;$sudo certbot certonly --standalone -d example.com -d www.example.com&lt;/pre&gt;

    &lt;p&gt;(You need to replace example.com with your domain name)&lt;/p&gt;

    &lt;p&gt;During the generation you’ll be asked for email address which LetsEncrypt will use to contact you if there are issues with the certificate.
 The certificate files will be located at: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/letsencrypt/live/example.com&lt;/code&gt;&lt;/p&gt;

    &lt;p&gt;If you are running nginx on the same machine you’ll get an error that port 80 is not available as its used for prooving that you are the domain owner. If this is the case you’ll need to stop nginx during the certificate generation&lt;/p&gt;
    &lt;pre&gt;$sudo /etc/init.d/nginx stop&lt;/pre&gt;
    &lt;p&gt;and enable it once the generation is completed&lt;/p&gt;
    &lt;pre&gt;$sudo /etc/init.d/nginx start&lt;/pre&gt;

    &lt;p&gt;&lt;img src=&quot;/static/img/certbot-logo.png&quot; alt=&quot;CertBot&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Once the certificate is generated we need to modify the nginx configuration file for that domain.
 The configuration file that we need to modify is located in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/nginx/sites-available&lt;/code&gt; .&lt;/p&gt;

    &lt;p&gt;nginx config file:
 (this is the nginx configuration I have used to enable SSL for my Home-assistant setup.)&lt;/p&gt;

    &lt;pre&gt;
 map $http_upgrade $connection_upgrade {
     default upgrade;
     &apos;&apos;      close;
 }
 server {
 	listen 80;
 	listen 443 ssl;
     server_name example.com;
     access_log  /var/log/nginx/access.log;
 	ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
 	ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
     location / {
         proxy_pass http://192.168.0.103:8123;
         proxy_set_header Host $host;
         proxy_redirect http:// https://;
         proxy_http_version 1.1;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection $connection_upgrade;
     }
    
 }
 &lt;/pre&gt;
  &lt;/li&gt;
  &lt;li&gt;Check if the changes you have made to nginx configuration files are valid:
    &lt;pre&gt;$nginx -t&lt;/pre&gt;
  &lt;/li&gt;
  &lt;li&gt;Reload Nginx Configuration:
    &lt;pre&gt;$sudo /etc/init.d/nginx reload&lt;/pre&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Renew your certificates:&lt;/p&gt;

    &lt;p&gt;Let’s Encrypt certificates are valid for 90 days. To renew your expiring certificate(s) use the command below:&lt;/p&gt;
    &lt;pre&gt;$sudo certbot renew&lt;/pre&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Set a cronjob to automaticall renew your certificates once per month.
Since I am running nginx and certbot on the same instance I had to stop nginx before renewing the certificates and enable it after that. I have used the cron below to renew the certificates at midnight on the 1-st of each month.&lt;/p&gt;

    &lt;pre&gt;0 0 1 * * sudo /etc/init.d/nginx stop; sudo /usr/bin/certbot renew; sudo /etc/init.d/nginx start&lt;/pre&gt;
  &lt;/li&gt;
&lt;/ol&gt;
</description>
        <pubDate>Tue, 15 Jan 2019 00:00:00 +0000</pubDate>
        <link>/linux/LetsEncrypt-Certificates/</link>
        <guid isPermaLink="true">/linux/LetsEncrypt-Certificates/</guid>
        
        
        <category>linux</category>
        
      </item>
    
      <item>
        <title>DNS Filtering</title>
        <description>&lt;h1 id=&quot;block-ads-and-protect-your-network-from-malware-by-changing-your-dns-provider&quot;&gt;Block ads and protect your network from malware by changing your DNS provider.&lt;/h1&gt;

&lt;p&gt;It is very easy to block more than 90% of the ads you see when you browse the web or use applications on your phone. All you have to do is use filtered dns service.
There are coule of them lately and they all offer slightly different services. Some of them block advertisement and malware-serving domains other also offer “Family protection”.&lt;/p&gt;

&lt;p&gt;If you create an account at opendns.com you’ll be able to choose from more than 50 customizable filtering categories and control what websites your children visit at home.&lt;/p&gt;

&lt;p&gt;The easiest way to change the DNS provider for your home network is to change your router network settings by pointing it to some of the DNS providers listed below.&lt;/p&gt;

&lt;p&gt;If you have a phone running Android 9 you can set a custom DNS server that will be used no mather what network you are connected to so you can block ads even when you are outside of your home network.&lt;/p&gt;

&lt;h2 id=&quot;ad-guard&quot;&gt;Ad Guard&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://dns.adguard.com&quot; target=&quot;_blank&quot;&gt;http://dns.adguard.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Adguard.com offers advertisement blocking plus malware protection.&lt;/p&gt;

&lt;p&gt;use these DNS servers if you want ads blocking and malware protection:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Preferred DNS server: &lt;strong&gt;176.103.130.130&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Alternative DNS server: &lt;strong&gt;176.103.130.131&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ads blocking, malware protection and “Family protection” servers.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Preferred DNS server: &lt;strong&gt;176.103.130.132&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Alternative DNS server: &lt;strong&gt;176.103.130.134&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;text-center&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/AdGuard.svg/220px-AdGuard.svg.png&quot; alt=&quot;adguard dns&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;privatedns---epsilon-eight&quot;&gt;PrivateDNS - EPSILON EIGHT&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://www.epsiloneight.com/private-dns&quot; target=&quot;_blank&quot;&gt;https://www.epsiloneight.com/private-dns&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Block over 114k advertisement and malware-serving domains&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Preferred DNS server: &lt;strong&gt;138.68.250.168&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;cleanbrowsing-dns&quot;&gt;CleanBrowsing DNS&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://cleanbrowsing.org/filters&quot; target=&quot;_blank&quot;&gt;https://cleanbrowsing.org/filters&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;They have 3 free content filters available via IPv4 and IPv6. Choose the one that fits your needs the most.&lt;/p&gt;

&lt;p&gt;All their IP addresses accept DNS request to the standard port 53 and 5353. DNS over TLS is available over port 853 and DNScrypt over port 8443.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Type&lt;/th&gt;
      &lt;th&gt;Server&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Security Filter&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;185.228.168.9&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Malicious domains blocked (phishing/ malware).&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Adult Filter&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;185.228.168.10&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Adult domains blocked. Search Engines set to safe mode +Security Filter&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Family Filter&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;185.228.168.168&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Proxies VPNs &amp;amp; Mixed Adult Content blocked. Youtube to safe mode +Adult&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;open-dns&quot;&gt;Open DNS&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.opendns.com/setupguide/#familyshield&quot; target=&quot;_blank&quot;&gt;https://www.opendns.com/setupguide/#familyshield&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;OpenDNS Family Shield&lt;/p&gt;

&lt;p&gt;Pre-configured to block adult content — set it &amp;amp; forget it&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Preferred DNS server: &lt;strong&gt;208.67.222.123&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Alternative DNS server: &lt;strong&gt;208.67.220.123&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;quad-9&quot;&gt;Quad 9&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.quad9.net&quot; target=&quot;_blank&quot;&gt;https://www.quad9.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quad 9 provides malware and malicious domains protection - there is no ads blocking.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Preferred DNS server: &lt;strong&gt;9.9.9.9&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Alternative DNS server: &lt;strong&gt;149.112.112.112&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;pi-hole-a-black-hole-for-internet-advertisements&quot;&gt;Pi-hole®: A black hole for Internet advertisements&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://pi-hole.net/&quot; target=&quot;_blank&quot;&gt;https://pi-hole.net/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a self hosted option. You can host pi-hole on a raspberry pi, docker container or VM and maintain your own block lists.
You can also use this with one of the DNS providers mentioned above.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://firebog.net/&quot; target=&quot;_blank&quot;&gt;https://firebog.net/&lt;/a&gt; - block lists to use with pi-hole&lt;/p&gt;

&lt;h2 id=&quot;other-dns-providers&quot;&gt;Other DNS providers&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Provider&lt;/th&gt;
      &lt;th&gt;DNS Server&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Google&lt;/td&gt;
      &lt;td&gt;8.8.8.8&lt;/td&gt;
      &lt;td&gt;Private and unfiltered. Most popular option.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Google&lt;/td&gt;
      &lt;td&gt;8.8.8.8&lt;/td&gt;
      &lt;td&gt;Private and unfiltered. Most popular option.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;CloudFlare&lt;/td&gt;
      &lt;td&gt;1.1.1.1&lt;/td&gt;
      &lt;td&gt;Private and unfiltered. New player.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Yandex DNS&lt;/td&gt;
      &lt;td&gt;77.88.8.7&lt;/td&gt;
      &lt;td&gt;Old player that blocks malicious domains. Very popular in Russia.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Comodo DNS&lt;/td&gt;
      &lt;td&gt;8.26.56.26&lt;/td&gt;
      &lt;td&gt;Old player that blocks malicious domains.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
</description>
        <pubDate>Wed, 02 Jan 2019 00:00:00 +0000</pubDate>
        <link>/windows/DNS-Filtering/</link>
        <guid isPermaLink="true">/windows/DNS-Filtering/</guid>
        
        
        <category>windows</category>
        
      </item>
    
      <item>
        <title>Windows 10 Auto Login</title>
        <description>&lt;h1 id=&quot;how-to-make-windows-10-automatically-login-without-password&quot;&gt;How to Make Windows 10 Automatically login without password.&lt;/h1&gt;

&lt;p&gt;If you are like me and don’t like to enter passwords each time you use your home computer, you’ll like this.&lt;/p&gt;

&lt;p&gt;This is the easiest way to automatically login to Windows 10 without entering a password.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Open Run command box by simultaneously pressing Windows logo and R keys (Windows+R). In the Run dialog box, type &lt;strong&gt;Netplwiz&lt;/strong&gt; and then press Enter key.&lt;/li&gt;
  &lt;li&gt;In the resulting User Accounts dialog, select your user account first and then uncheck the option labeled &lt;strong&gt;Users must enter a user name and password to use this computer&lt;/strong&gt;. Click Apply button to see Automatically sign in box.&lt;/li&gt;
  &lt;li&gt;In the Automatically sign in dialog, type your password and then re-enter the password to confirm it is the same.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Restart your computer to test if the auto login is working.&lt;/p&gt;
</description>
        <pubDate>Mon, 31 Dec 2018 00:00:00 +0000</pubDate>
        <link>/windows/How-to-make-win-10-auto-login/</link>
        <guid isPermaLink="true">/windows/How-to-make-win-10-auto-login/</guid>
        
        
        <category>windows</category>
        
      </item>
    
      <item>
        <title>How to create a static site with python and host it for free</title>
        <description>&lt;h2 id=&quot;in-this-articel-ill-show-you-how-to-create-a-static-html-site-with-pelican-and-host-it-for-free-at-github-pages&quot;&gt;In this articel I’ll show you how to create a static html site with Pelican and host it for free at &lt;a href=&quot;https://pages.github.com/&quot; target=&quot;_blank&quot;&gt;GitHub Pages&lt;/a&gt;.&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/getpelican/pelican&quot; target=&quot;_blank&quot;&gt;Pelican&lt;/a&gt; is a static site generator, written in Python, that requires no database or server-side logic.
&lt;img src=&quot;/static/img/python_pelican.png&quot; alt=&quot;Pelican&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;installing-pelican&quot;&gt;Installing Pelican&lt;/h3&gt;

&lt;p&gt;The easiest way to install Pelican is using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pip&lt;/code&gt;, use the command below to install it along with the Markdown module:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ sudo pip install pelican Markdown
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;initialize-your-site&quot;&gt;Initialize your site&lt;/h3&gt;

&lt;p&gt;Once Pelican has been installed, you can create a skeleton project via the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pelican-quickstart&lt;/code&gt; command, which begins by asking some questions about your site:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ pelican-quickstart
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Once you answer all questions Pelican will create the files and folders shown below:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;yourproject/
├── content
│   ├── (pages)          # These folders are not auto-created
│   ├── (posts) 
│   └── (images)
├── output
├── develop_server.sh
├── fabfile.py
├── Makefile
├── pelicanconf.py       # Main settings file
└── publishconf.py       # Settings to use when ready to publish
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Your site content should be placed in the content folder. If you plan to create a blog, you’ll need to create a folder named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;posts&lt;/code&gt; in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;content&lt;/code&gt; folder, if you need just static pages that are not chronological create a folder named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pages&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The images for your site or blog should be located in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;content/images&lt;/code&gt; folder.&lt;/p&gt;

&lt;p&gt;You also need to tell Pelican that this folder holds your static content and images by adding the line below to ‘pelicanconf.py’ :&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;STATIC_PATHS = [&apos;images&apos;]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;You can have more than one folder for static content and you can also pick another location.&lt;/p&gt;

&lt;h3 id=&quot;building-your-content&quot;&gt;Building your content&lt;/h3&gt;

&lt;p&gt;To create a new page or blog post you need to create a file in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pages&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;posts&lt;/code&gt; folder.
This file needs to be ending in .md, .markdown, .mkd, or .mdown and contain text formated with markdown syntax.&lt;/p&gt;

&lt;p&gt;Your file may contain the following meta-data (not all values are mandatory)&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Title: My post title
Date: 2018-02-03 11:21
Modified: 2018-02-05 17:30
Category: Python
Tags: pelican, publishing
Slug: my-blog-post
Authors: John Smith, Hristo Jelev
Summary: Short version for index and feeds

This is the content of my first blog post.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To add images to your content use the markdown below:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;![Alt text](images/filename.jpg)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Add link with target=”_blank”:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[link](url){:target=&quot;_blank&quot;}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;If you are not familiar with markdown syntax look at &lt;a href=&quot;https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet&quot; target=&quot;_blank&quot;&gt;markdown cheat sheet&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you create all the pages and articles its time to generate your site html.&lt;/p&gt;

&lt;h3 id=&quot;generating-your-site-html&quot;&gt;Generating your site HTML&lt;/h3&gt;

&lt;p&gt;To generate your site, go to your project root folder and run the command below:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ pelican content
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;You can also use:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ pelican -r
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This command will regenerate your site each time a change is detected.&lt;/p&gt;

&lt;p&gt;When the generation is complete all the files (html, images, css and maybe others) for your new site will be located in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;output&lt;/code&gt; folder.&lt;/p&gt;

&lt;h3 id=&quot;preview-your-site&quot;&gt;Preview your site&lt;/h3&gt;

&lt;p&gt;Its useful to view your site before uploading it to your hosting. To run a local web server use one of the commands below.&lt;/p&gt;

&lt;p&gt;For Python 2, run:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ cd output
$ python -m SimpleHTTPServer
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For Python 3, run:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ cd output
$ python -m http.server
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Once you start the web server you can preview your site at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://localhost:8000/&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;hosting&quot;&gt;Hosting&lt;/h3&gt;

&lt;p&gt;One of the best free places to host your static site for free is &lt;a href=&quot;https://pages.github.com/&quot; target=&quot;_blank&quot;&gt;Github Pages&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/static/img/github_logo.png&quot; alt=&quot;Github Pages&quot; /&gt;&lt;/p&gt;

&lt;p&gt;On github pages you’ll find detailed instructions how to upload your site with git.
If you don’t have git installed you can install it with:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ sudo apt-get install git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Once your site is uploaded to github pages its url will look like this &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;https://username.github.io&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can change this by adding a custom domain to your github repository.
If you don’t have a domain name you can get one for free from http://www.dot.tk - they offer five domain extension for free (.tk, .ga, .ml, .cf and .gq).&lt;/p&gt;

&lt;p&gt;First add your domain name to your new github repository by following &lt;a href=&quot;https://help.github.com/articles/adding-or-removing-a-custom-domain-for-your-github-pages-site/&quot; target=&quot;_blank&quot;&gt;these&lt;/a&gt; instructions.&lt;/p&gt;

&lt;p&gt;Then point your custom domain to the following IP addresses:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;185.199.108.153
185.199.109.153
185.199.110.153
185.199.111.153
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;https://help.github.com/articles/setting-up-an-apex-domain/&quot; target=&quot;_blank&quot;&gt;Here&lt;/a&gt; are other ways to point your domain to github pages.&lt;/p&gt;

</description>
        <pubDate>Thu, 08 Mar 2018 00:00:00 +0000</pubDate>
        <link>/python/How-to-create-a-static-site-and-host-it/</link>
        <guid isPermaLink="true">/python/How-to-create-a-static-site-and-host-it/</guid>
        
        
        <category>python</category>
        
      </item>
    
      <item>
        <title>How to translate a Flask site with Babel</title>
        <description>&lt;p&gt;This article will show you how to translate your Fask site using the python module Babel on a Debian based system running python 3.&lt;/p&gt;

&lt;h2 id=&quot;install-flask-babel&quot;&gt;Install Flask-Babel&lt;/h2&gt;

&lt;p&gt;First you need to install the python module &lt;a href=&quot;https://pythonhosted.org/Flask-Babel/&quot;&gt;Flask-Babel&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ sudo pip install Flask-Babel
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;configure-flask-babel-and-hook-it-to-your-site&quot;&gt;Configure Flask-Babel and hook it to your site&lt;/h2&gt;
&lt;p&gt;Once Babel is installed we’ll need to configure it.&lt;/p&gt;

&lt;p&gt;Create a file named ‘‘babel.cfg’’ in the root of your flask project and put the code below in it.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[python: **.py]
[jinja2: **.html]
extensions=jinja2.ext.autoescape,jinja2.ext.with_
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now we need to hook babel to our flask application as shown below:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;from flask import Flask, [...]
from flask.ext.babel import Babel, gettext
app = Flask(__name__)
babel = Babel(app)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Also we need to tell Babel what languages we need to support, put the code below in your application.
In this example, we add two locales, english (‘en’) and bulgarian (‘bg’).&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# add to you main app code
LANGUAGES = {
    &apos;en&apos;: &apos;English&apos;,
    &apos;bg&apos;: &apos;Bulgarian&apos;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Finally we need to make our code select the best matching locale, based on the Accept-Language header from the incoming request.&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# add to you main app code
@babel.localeselector
def get_locale():
    return request.accept_languages.best_match(LANGUAGES.keys())
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;##Tagging Strings for Translation&lt;/p&gt;

&lt;p&gt;Once you installed and configured Flask-Babel it’s time to tag all the Strings you want to translate. In a typical Flask app, there will be two types of Strings that require translating. One being hard-coded Strings in your .py files and the other being Strings in your .html Jinja2 templates.&lt;/p&gt;

&lt;h3 id=&quot;tagging-strings-in-py-files&quot;&gt;Tagging Strings in py files:&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;title = &apos;My home page title&apos;
print(&apos;Text for tanslation&apos;)

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;becomes&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;title = gettext(&apos;My home page title&apos;)
print(gettext(&apos;Text for tanslation&apos;))

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;tagging-strings-in--jinja2-templates&quot;&gt;Tagging Strings in  Jinja2 templates:&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;p class=&quot;lead&quot;&amp;gt;Movies found today.&amp;lt;/p&amp;gt;
&amp;lt;input type=&quot;submit&quot; value=&quot;Search&quot;/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;becomes&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;p class=&quot;lead&quot;&amp;gt; &amp;lt;/p&amp;gt;
&amp;lt;input type=&quot;submit&quot; value=&quot;&quot;/&amp;gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can use _() as a shortcut for gettext().&lt;/p&gt;

&lt;h2 id=&quot;building-locales&quot;&gt;Building Locales&lt;/h2&gt;

&lt;p&gt;Once we have tagged all the string in our code and templates, its time to build a catalog for the Locales we want to create.  Run:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ pybabel extract -F babel.cfg -o messages.pot --input-dirs=.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This checks all files specified in babel.cfg and searches through them to find tagged strings and outputs them to messages.pot.
After all the translated strings are indexed its time to initialize our locale:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ pybabel init -i messages.pot -d translations -l bg
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The example above initializes the Bulgarian locale and creates the files we need to translate.
Open &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;translations/bg/LC_MESSAGES/messages.po&lt;/code&gt; with you favorite text editor and translate the msgstr values for all the strings you have tagged.&lt;/p&gt;

&lt;p&gt;The final step to get your site translated is to compile the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;messages.po&lt;/code&gt; file, to do so run the command below:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ pybabel compile -d translations
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;updating-locales&quot;&gt;Updating locales&lt;/h2&gt;

&lt;p&gt;After a while you’ll add new content to your site and there will be new strings for translation.
Run again this command to extract the new strings:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ pybabel extract -F babel.cfg -o messages.pot --input-dirs=.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Then run pybabel update to update your locale file &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;messages.po&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ pybabel update -i messages.pot -d translations
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Translate the new strings and compile your locale:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ pybabel compile -d translations
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
        <pubDate>Sat, 24 Feb 2018 00:00:00 +0000</pubDate>
        <link>/python/How-to-translate-your-flask-site/</link>
        <guid isPermaLink="true">/python/How-to-translate-your-flask-site/</guid>
        
        
        <category>python</category>
        
      </item>
    
      <item>
        <title>Build a Cheap Multi-Room Audio System</title>
        <description>&lt;h1 id=&quot;how-to-build-cheap-multi-room-audio-system&quot;&gt;How to build cheap Multi-Room Audio System&lt;/h1&gt;

&lt;h2 id=&quot;this-build-will-use-raspberry-pis-for-network-players-and-logitec-media-server-that-can-be-run-on-windows-or-linux&quot;&gt;This build will use raspberry pis for network players and logitec media server that can be run on windows or linux.&lt;/h2&gt;
&lt;p&gt;Logitec Media Server &lt;a href=&quot;https://www.mysqueezebox.com/download&quot; target=&quot;_blank&quot;&gt;LMS&lt;/a&gt; is a media server made for the logitec squeezebox Network music players. We will use this software for our project and will build squeezebox players using a raspberry pi, USB sound card and some multimedia speakers.&lt;/p&gt;

&lt;h2 id=&quot;the-parts-we-need&quot;&gt;The parts we need:&lt;/h2&gt;
&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Raspberry Pi Zero W&lt;/strong&gt; (you can use other models but this is the perfect one)&lt;/li&gt;
  &lt;li&gt;Any &lt;strong&gt;SD card&lt;/strong&gt; that can fit raspbian light - bigger cards will last longer.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;USB sound card&lt;/strong&gt; (I have used this cheap $1.5 &lt;a href=&quot;https://www.gearbest.com/cables-connectors/pp_621980.html&quot; target=&quot;_blank&quot;&gt;sound card&lt;/a&gt; from gearbest.com)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Micro USB Male to USB Female Cable Adapter&lt;/strong&gt; - we need this as the raspberry pi zero have only one micro usb port.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Micro USB cable&lt;/strong&gt; and &lt;strong&gt;5v power supply&lt;/strong&gt; to power the raspberry pi.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Multimedia Speakers&lt;/strong&gt; with 3.5 inch audio input.&lt;br /&gt;
I have started my multi-room audio system with Logitech Multimedia 2.1 Speakers Z213 as they are very cheap and offer decent sound for their price - around $25. Later I have picked Logitech Z333.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;USB hub&lt;/strong&gt; and &lt;strong&gt;USB network card&lt;/strong&gt; - wi-fi or wired depending on your need - (You’ll need this if you don’t use pi zero w)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;/static/img/RaspberryPi-Zero-W-Top_128x.png&quot; alt=&quot;Raspberry pi 0 w&quot; /&gt;&lt;/p&gt;

&lt;p&gt;These are the parts we need to build one of ours network music players.&lt;/p&gt;

&lt;p&gt;We also need a computer for the Logitech Media Server - in my experience this server works best on windows computers. 
I am hosting mine on a PIPO X8 its a tablet like computer with 12v power supply, Windows 10, Intel Z3736F Quad Core CPU, 2GB ram and 64GB disk space.&lt;/p&gt;

&lt;p&gt;For the hosting of the logitech media server you can use your desktop computer, an old laptop, a raspberry pi (model 3 or 2), Netgear NAS and maybe something else.&lt;/p&gt;

&lt;p&gt;Go to &lt;a href=&quot;https://www.mysqueezebox.com/download&quot; target=&quot;_blank&quot;&gt;Logitech Media Server&lt;/a&gt; site and download the version matching your choice of OS.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://wiki.slimdevices.com/index.php/Logitech_Media_Server#Installing_to_a_Computer_or_Laptop&quot; target=&quot;_blank&quot;&gt;Here you can find instructions for installing LMS on different operation systems&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/static/img/logitech-logo.png&quot; alt=&quot;Logitec Media Server&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;preparing-the-raspberry-pi-sd-card&quot;&gt;Preparing the raspberry pi SD card:&lt;/h2&gt;

&lt;p&gt;I’ll show you how to prepare the SD card with a Windows computer. This is the SD card we’ll use for our network music players.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Download and install &lt;a href=&quot;https://freeapps.ml/win32-disk-imager.html&quot; target=&quot;_blank&quot;&gt;Win32 Disk Imager&lt;/a&gt; on your PC.&lt;/li&gt;
  &lt;li&gt;Download &lt;a href=&quot;https://www.raspberrypi.org/downloads/raspbian/&quot; target=&quot;_blank&quot;&gt;Raspbian Stretch Lite&lt;/a&gt; image from raspberrypi.org site. (you can also use the full version but there is no need to do so and it is bigger)&lt;/li&gt;
  &lt;li&gt;Use Win32 disk imager to write the raspbian image you have just downloaded to the SD card.&lt;/li&gt;
  &lt;li&gt;If you plan to connect this player/rpi via wifi, now is the time to configure the wi-fi network credentials (if you don’t do so now you’ll have to attach monitor and a keyboard to your rpi later).
Create a file &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wpa_supplicant.conf&lt;/code&gt; and place it in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;boot&lt;/code&gt; partition.
wpa_supplicant.conf
    &lt;pre&gt;
 ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
 update_config=1
 network={
 ssid=&quot;YourNetworkSSID-1&quot;
         psk=&quot;passwordOne&quot;
         }&lt;/pre&gt;
  &lt;/li&gt;
  &lt;li&gt;To enable ssh create an empty file named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ssh&lt;/code&gt; and place it in the boot partition.&lt;/li&gt;
  &lt;li&gt;Insert the SD card in the raspberry pi, connect the USB sound card using the cable adapter, connect the 5v power supply, after less than 1 minute it should boot and connect to the network.&lt;/li&gt;
  &lt;li&gt;Now you need to find the IP address of the raspberry pi, you can do that by checking the DHCP clients in you router control panel or use your phone and an application like &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.overlook.android.fing&quot; target=&quot;_blank&quot;&gt;Fing&lt;/a&gt; (there is also an iphone version of Fing)&lt;/li&gt;
  &lt;li&gt;Once you find the ip address ssh to it using &lt;a href=&quot;https://www.putty.org/&quot; target=&quot;_blank&quot;&gt;Putty&lt;/a&gt; or your favorite ssh client.&lt;br /&gt;
 When connecting use user &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pi&lt;/code&gt; and password &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;raspberry&lt;/code&gt;&lt;br /&gt;
 After you log in for a first time change the default password with
    &lt;pre&gt;$ passwd&lt;/pre&gt;
  &lt;/li&gt;
  &lt;li&gt;Update your system packages by running
    &lt;pre&gt;$ sudo apt-get -y update &amp;amp;&amp;amp; sudo apt-get -y dist-upgrade&lt;/pre&gt;
    &lt;p&gt;This will take some time.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;Install some libraries that are needed by squeezelite
    &lt;pre&gt;$ sudo apt-get install -y libflac-dev libfaad2 libmad0&lt;/pre&gt;
  &lt;/li&gt;
  &lt;li&gt;Create a folder for squeezelite and download it:
    &lt;pre&gt;$ mkdir squeezelite
$ cd squeezelite
$ wget -O squeezelite-armv6hf.tar.gz http://www.gerrelt.nl/RaspberryPi/squeezelite_ralph/squeezelite-armv6hf.tar.gz
$ tar -xvzf squeezelite-armv6hf.tar.gz&lt;/pre&gt;
    &lt;p&gt;&lt;a href=&quot;https://sourceforge.net/projects/lmsclients/files/squeezelite/linux/&quot; target=&quot;_blank&quot;&gt;Here&lt;/a&gt; you can find Squeezelite and other LMS Clients for different OS.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;Now set the sound level:
    &lt;pre&gt;$ sudo alsamixer&lt;/pre&gt;
    &lt;p&gt;Use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;F6&lt;/code&gt; key to select the right sound card (I am using an USB sound card), and then set the volume using the arrow keys. Set the volume just before the red zone also set the microphone volume to zero, to make sure it will not cause any noise.
then type:&lt;/p&gt;
    &lt;pre&gt;$sudo alsactl store&lt;/pre&gt;
    &lt;p&gt;to save the soundcard output levels so they don’t revert after restarting the system.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;Before we can run squeezelite we need to find the name of our usb sound card.
    &lt;pre&gt;$ ./squeezelite -l&lt;/pre&gt;
    &lt;p&gt;You’ll get an output like the one below:&lt;/p&gt;
    &lt;pre&gt;
Output devices:
  null                           - Discard all samples (playback) or generate zero samples (capture)
  pulse                          - PulseAudio Sound Server
  default:CARD=ALSA              - bcm2835 ALSA, bcm2835 ALSA - Default Audio Device
  sysdefault:CARD=ALSA           - bcm2835 ALSA, bcm2835 ALSA - Default Audio Device
  dmix:CARD=ALSA,DEV=0           - bcm2835 ALSA, bcm2835 ALSA - Direct sample mixing device
  dmix:CARD=ALSA,DEV=1           - bcm2835 ALSA, bcm2835 IEC958/HDMI - Direct sample mixing device
  dsnoop:CARD=ALSA,DEV=0         - bcm2835 ALSA, bcm2835 ALSA - Direct sample snooping device
  dsnoop:CARD=ALSA,DEV=1         - bcm2835 ALSA, bcm2835 IEC958/HDMI - Direct sample snooping device
  hw:CARD=ALSA,DEV=0             - bcm2835 ALSA, bcm2835 ALSA - Direct hardware device without any conversions
  hw:CARD=ALSA,DEV=1             - bcm2835 ALSA, bcm2835 IEC958/HDMI - Direct hardware device without any conversions
  plughw:CARD=ALSA,DEV=0         - bcm2835 ALSA, bcm2835 ALSA - Hardware device with all software conversions
  plughw:CARD=ALSA,DEV=1         - bcm2835 ALSA, bcm2835 IEC958/HDMI - Hardware device with all software conversions
  default:CARD=Device            - USB Audio Device, USB Audio - Default Audio Device
  sysdefault:CARD=Device         - USB Audio Device, USB Audio - Default Audio Device
  front:CARD=Device,DEV=0        - USB Audio Device, USB Audio - Front speakers
  surround21:CARD=Device,DEV=0   - USB Audio Device, USB Audio - 2.1 Surround output to Front and Subwoofer speakers
  surround40:CARD=Device,DEV=0   - USB Audio Device, USB Audio - 4.0 Surround output to Front and Rear speakers
  surround41:CARD=Device,DEV=0   - USB Audio Device, USB Audio - 4.1 Surround output to Front, Rear and Subwoofer speakers
  surround50:CARD=Device,DEV=0   - USB Audio Device, USB Audio - 5.0 Surround output to Front, Center and Rear speakers
  surround51:CARD=Device,DEV=0   - USB Audio Device, USB Audio - 5.1 Surround output to Front, Center, Rear and Subwoofer speakers
  surround71:CARD=Device,DEV=0   - USB Audio Device, USB Audio - 7.1 Surround output to Front, Center, Side, Rear and Woofer speakers
  iec958:CARD=Device,DEV=0       - USB Audio Device, USB Audio - IEC958 (S/PDIF) Digital Audio Output
  dmix:CARD=Device,DEV=0         - USB Audio Device, USB Audio - Direct sample mixing device
  dsnoop:CARD=Device,DEV=0       - USB Audio Device, USB Audio - Direct sample snooping device
  hw:CARD=Device,DEV=0           - USB Audio Device, USB Audio - Direct hardware device without any conversions
  plughw:CARD=Device,DEV=0       - USB Audio Device, USB Audio - Hardware device with all software conversions
&lt;/pre&gt;
    &lt;p&gt;Since we are using a USB Audio Device we need to pick one of the listed USB devices. I am using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;front:CARD=Device,DEV=0&lt;/code&gt; as it works best for me. 
You can test the other USB devices and decide for yourself.&lt;/p&gt;
    &lt;pre&gt;$ ./squeezelite -n Player-location -m 15:c4:20:16:b7:4f -o front:CARD=Device,DEV=0&lt;/pre&gt;
    &lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-n&lt;/code&gt; sets the name of the player - the name that you’ll see when you control it.&lt;br /&gt;
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-m&lt;/code&gt; is the mac address of the network player - pick a random mac address - it should be unique for each player in your network.&lt;br /&gt;
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-o&lt;/code&gt; is the output device used for the playback (your USB sound card)&lt;br /&gt;
If you don’t see any error go to logitech media server and check if you see your new player (the players are listed in the top right section of LMS web control panel). 
You can test the player to make sure its working properly.
When done testing you can close the server with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Ctrl+C&lt;/code&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;Starting Squeezelite on Startup.&lt;br /&gt;
There are many ways you can use to start the player on start up. The easiest one I have found is using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;crontab&lt;/code&gt;.
    &lt;pre&gt;$ crontab -e&lt;/pre&gt;
    &lt;p&gt;and add this line somewhere in the file&lt;/p&gt;
    &lt;pre&gt;@reboot sudo -u pi /home/pi/squeezelite/squeezelite -n Player_Name -m 15:c4:20:16:b7:4f -o front:CARD=Device,DEV=0 &amp;amp; &lt;/pre&gt;
  &lt;/li&gt;
  &lt;li&gt;Reboot your raspberry pi to make sure the player is loaded on startup.
This is all you need to do to create a new network music player for your multi-room audio system. 
For the other players you need to repeat all the steps described above and pick a different mac (-m) address and name (-n) in the player configuration step.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;stability-of-the-system&quot;&gt;Stability of the system&lt;/h2&gt;

&lt;p&gt;The players can work fine on wi-fi if you have decent wi-fi coverage.&lt;br /&gt;
It is recommended that you run your LM server on a wired connection thus it can also work on wi-fi.&lt;/p&gt;

&lt;p&gt;The stability of the players mainly depends on the choice of the USB sound card. I have tested maybe 5 different cheap (up to $3) sound cards and only the one listed in the parts section works without causing problems. The others will make the player hung in silence or repeating a very annoying sound. 
If you use raspberry pi zero, when playing music the CPU load should be around 0.15.
If you want better sound and you can afford to pay more you can build your players with &lt;a href=&quot;https://www.hifiberry.com/&quot; target=&quot;_blank&quot;&gt;HiFiBerry Amplifier&lt;/a&gt; or some other rapsberry pi compatible Amplifier.&lt;/p&gt;

&lt;p&gt;Using a bad SD card can also affect the system stability.&lt;/p&gt;

&lt;p&gt;I am using such multi-room audio system with 2 raspberry pi network players that run 24/7 - one on wi-fi the other on LAN and there are months with no outages.
There is also a third player on my windows desktop PC - this one causes no issues but it is rebooted daily.&lt;/p&gt;

&lt;p&gt;If some player (mainly the wi-fi one) disappears from the network or I don’t see it in LMS I just restart it from the plug and it comes back in a minute.&lt;/p&gt;

&lt;p&gt;You can start a network player on the computer running the logitech media server using a build in plug-in.&lt;/p&gt;

&lt;h2 id=&quot;what-media-is-supported-by-my-multi-room-audio-system&quot;&gt;What media is supported by my multi-room audio system?&lt;/h2&gt;

&lt;p&gt;Logitech Media Server supports many audio sources that you can enjoy now:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Your own MP3 collection, it can be located on any samba share in your network or the computer running the server.&lt;/li&gt;
  &lt;li&gt;Spotify - you need a paid account.&lt;/li&gt;
  &lt;li&gt;Many free on-line sources like SomaFM, SoundCloud, TuneIn Radio (tons of on-line radio stations), YouTube and others - these depends on your location. You can see them all &lt;a href=&quot;https://www.mysqueezebox.com/appgallery&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Custom streams from URLs you add.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can use your new multi-room audio system to play synchronized music in all of your rooms or if you prefer you can play different music in each room. You can also have a group of synchronized players and stand alone players playing different music.&lt;/p&gt;

&lt;h2 id=&quot;how-can-we-control-the-system&quot;&gt;How can we Control the system?&lt;/h2&gt;

&lt;p&gt;The easiest way is to use the web interface located at http://lms_server_ip:9000 (you can change that port to 80 from LMS configuration)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/static/img/Logitech-Media-Server-500x366.png&quot; alt=&quot;Logitec Media Server web interface&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can also use a phone application to play your music. The best I found for android phones is &lt;a href=&quot;https://play.google.com/store/apps/details?id=uk.org.ngo.squeezer&quot; target=&quot;_blank&quot;&gt;squeezer&lt;/a&gt;. It automatically discovers my LSM when on the same network and allows me to control most of the functions of the server.&lt;/p&gt;
</description>
        <pubDate>Sun, 21 Jan 2018 00:00:00 +0000</pubDate>
        <link>/raspberry-pi/multi-room-audio-system-with-rpis/</link>
        <guid isPermaLink="true">/raspberry-pi/multi-room-audio-system-with-rpis/</guid>
        
        
        <category>raspberry-pi</category>
        
      </item>
    
      <item>
        <title>How to Host Multiple Python Apps on the Same Host With Nginx</title>
        <description>&lt;h1 id=&quot;configure-nginx-as-a-reverse-proxy&quot;&gt;Configure NGINX as a reverse proxy&lt;/h1&gt;

&lt;p&gt;&lt;img src=&quot;/static/img/nginx-logo.svg&quot; alt=&quot;NGINX&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In this tutorial we assume that there are two python applications / sites running on ports 8000 and 8001 and we need to point example1.com to the application on port 8000 and example2.com to the application on port 8001.&lt;/p&gt;

&lt;p&gt;First we need to make sure that the domains DNS is pointing to the external IP of our server.&lt;/p&gt;

&lt;p&gt;Then we’ll need to install nginx which will play the role of a proxy server that will forward the traffic from port 80 to the python application port depending on the origination domain.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ sudo apt-get install nginx
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Once nginx is installed we need to create individual nginx site file for each site under &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/nginx/sites-available/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;/etc/nginx/sites-available/example1.com&lt;/p&gt;

&lt;pre&gt;
server {
	listen 80;
	server_name example1.com;
	access_log  /var/log/nginx/access.log;

	location / {
		proxy_pass http://127.0.0.1:8000;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	}

}
&lt;/pre&gt;

&lt;p&gt;/etc/nginx/sites-available/example2.com&lt;/p&gt;

&lt;pre&gt;
server {
    listen 80;
    server_name example2.com;
    access_log  /var/log/nginx/access.log;

    location / {
        proxy_pass http://127.0.0.1:8001;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}
&lt;/pre&gt;

&lt;p&gt;To enable these sites for nginx, create a symlink from the files we just created to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/nginx/sites-enabled/&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ sudo ln -s /etc/nginx/sites-available/example1.com /etc/nginx/sites-enabled/example1.com
$ sudo ln -s /etc/nginx/sites-available/example2.com /etc/nginx/sites-enabled/example2.com
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After nginx is restarted to load the new sites we just created they should be resolving properly.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ sudo /etc/init.d/nginx restart
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can use this method to host more than two sites, just make sure you use the correct domain and port number in the nginx sites-available configuration file.&lt;/p&gt;

&lt;p&gt;If you want to install SSL certificates for your domains you can look at this article -
&lt;a href=&quot;/linux/LetsEncrypt-Certificates/&quot;&gt;Install LetsEncrypt Certificate&lt;/a&gt; .&lt;/p&gt;
</description>
        <pubDate>Sun, 21 Jan 2018 00:00:00 +0000</pubDate>
        <link>/linux/How-to-Host-Multiple-Python-Apps-on-the-Same-Host-With-Nginx/</link>
        <guid isPermaLink="true">/linux/How-to-Host-Multiple-Python-Apps-on-the-Same-Host-With-Nginx/</guid>
        
        
        <category>linux</category>
        
      </item>
    
      <item>
        <title>OS for Raspberry Pi</title>
        <description>&lt;h2 id=&quot;collection-of-different-os-distributions-for-the-sbc-raspberry-pi&quot;&gt;Collection of different OS Distributions for the SBC Raspberry Pi&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/ccrisan/motioneyeos&quot; target=&quot;_blank&quot;&gt;motionEyeOS&lt;/a&gt; - a Linux distribution that turns your single board computer into a video surveillance system.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;http://dietpi.com/&quot; target=&quot;_blank&quot;&gt;Diet Pi&lt;/a&gt; - DietPi is a extremely lightweight Debian Jessie OS. With images starting at 400MB, thats 3x lighter than ‘Raspbian Lite’.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;http://openelec.tv/get-openelec/category/7-raspberry-pi2-builds&quot; target=&quot;_blank&quot;&gt;OpenELEC&lt;/a&gt; -  is a small Linux based Just Enough Operating System (JeOS) built from scratch as a platform to turn your computer into a Kodi media center.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://ubuntu-mate.org/raspberry-pi/&quot; target=&quot;_blank&quot;&gt;Ubuntu MATE&lt;/a&gt; - for the Raspberry Pi 2 and Raspberry Pi 3&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://retropie.org.uk/download/&quot; target=&quot;_blank&quot;&gt;RetroPie&lt;/a&gt; - RetroPie allows you to turn your Raspberry Pi or PC into a retro-gaming machine.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;http://piplay.org/&quot; target=&quot;_blank&quot;&gt;PiPlay&lt;/a&gt; - The pre built Raspberry Pi OS made for gaming and emulation.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.recalbox.com/&quot; target=&quot;_blank&quot;&gt;Recalbox&lt;/a&gt; - offers a wide selection of consoles and game systems. From the very first arcade systems to the NES, the MEGADRIVE and even 32-bit platforms, such as the Playstation.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;http://www.pimusicbox.com/&quot; target=&quot;_blank&quot;&gt;Pi MusicBox&lt;/a&gt; - standalone streaming music player for Spotify, Google Music, SoundCloud, Webradio, Podcasts and other music from the cloud.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://volumio.org/get-started/&quot; target=&quot;_blank&quot;&gt;Volumio&lt;/a&gt; - Volumio is meant to be an headless dap (digital audio player), just connect it to your home stereo system or your DAC.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;http://tinyurl.com/slespi&quot; target=&quot;_blank&quot;&gt;SUSE&lt;/a&gt; - Linux Enterprise Server on the Raspberry Pi&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.raspberrypi.org/downloads/noobs/&quot; target=&quot;_blank&quot;&gt;NOOBS&lt;/a&gt; - Beginners should start with NOOBS&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://sourceforge.net/p/minibian&quot; target=&quot;_blank&quot;&gt;Minibian-wifi&lt;/a&gt; - MINIBIAN is a minimal Raspbian-based Linux image for Raspberry Pi that fits on a 1GB SD card.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href=&quot;https://www.reddit.com/r/SBCGaming/wiki/pidiskimages_definitivelist&quot; target=&quot;_blank&quot;&gt;Raspberry Pi Disk Images – Definitive List&lt;/a&gt;&lt;/p&gt;

</description>
        <pubDate>Sat, 20 Jan 2018 00:00:00 +0000</pubDate>
        <link>/raspberry-pi/rpi-os-distributions/</link>
        <guid isPermaLink="true">/raspberry-pi/rpi-os-distributions/</guid>
        
        
        <category>raspberry-pi</category>
        
      </item>
    
      <item>
        <title>Python Modules I Use</title>
        <description>&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://pypi.python.org/pypi/Markdown&quot;&gt;Markdown&lt;/a&gt; - Python implementation of Markdown.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://wiki.python.org/moin/UsingPickle&quot;&gt;Pickle&lt;/a&gt; - Pickling is a way to convert a python object (list, dict, etc.) into a character stream. The idea is that this character stream contains all the information necessary to reconstruct the object in another python script.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://pythonhosted.org/jira/#installation&quot;&gt;Python JIRA&lt;/a&gt; - Python library to work with JIRA APIs&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/amnong/easywebdav&quot;&gt;EasyWebDAV&lt;/a&gt; - A WebDAV Client in Python&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/adafruit/Adafruit_Python_DHT&quot;&gt;Adafruit Python DHT Sensor Library&lt;/a&gt; - Python library to read the DHT series of humidity and temperature sensors on a Raspberry Pi&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/john-kurkowski/tldextract&quot;&gt;tldextract&lt;/a&gt; - accurately separates the gTLD or ccTLD (generic or country code top-level domain) from the registered domain and subdomains of a URL.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://pypi.python.org/pypi/feedparser&quot;&gt;FeedParser&lt;/a&gt; - Universal feed parser, handles RSS 0.9x, RSS 1.0, RSS 2.0, CDF, Atom 0.3, and Atom 1.0 feeds&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;http://webpy.org/&quot;&gt;Webpy&lt;/a&gt; - a web framework for Python that is as simple as it is powerful.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.crummy.com/software/BeautifulSoup/&quot;&gt;BeautifulSoup&lt;/a&gt; - a Python library designed for quick turnaround projects like screen-scraping.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://pypi.python.org/pypi/paho-mqtt&quot;&gt;Paho-MQTT&lt;/a&gt; - MQTT Python client library, which implements versions 3.1 and 3.1.1 of the MQTT protocol.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;http://www.fabfile.org/&quot;&gt;Fabric&lt;/a&gt; - Fabric is a Python (2.5-2.7) library and command-line tool for streamlining the use of SSH for application deployment or systems administration tasks.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

</description>
        <pubDate>Sat, 20 Jan 2018 00:00:00 +0000</pubDate>
        <link>/python/python-modules-i-use/</link>
        <guid isPermaLink="true">/python/python-modules-i-use/</guid>
        
        
        <category>python</category>
        
      </item>
    
      <item>
        <title>Basic IPTables Tutorial</title>
        <description>&lt;p&gt;This is the iptables configuration I have used to secure my pihole instance before exposing it publicly.&lt;/p&gt;

&lt;p&gt;This configuration will close all ports, then allow connections on port 80, 443, 123 and allow ping to IP 192.168.0.103 which is hosting my pihole.
Allow access to port 53 from your local network. 
Then it will open port 53 only to IP 46.249.76.212 (you can allow multiple IPs by cloning the 4 lines from the configuration for IP 46.249.76.212 )&lt;/p&gt;

&lt;p&gt;First we need to create a file that will hold our iptables rules.&lt;br /&gt;
I have chosen to name this file &lt;strong&gt;iptables.up.rules&lt;/strong&gt; and create it in &lt;strong&gt;/etc&lt;/strong&gt; folder. You can pick any name and location you like, just remember to use them in the auto start bash script we’ll create at the end of this tutorial.&lt;/p&gt;

&lt;p&gt;Run the command below to list the current iptables rules:&lt;/p&gt;

&lt;pre&gt;$ sudo iptables --list&lt;/pre&gt;

&lt;p&gt;Then run this command to save the current rules in a file that we’ll modify in the next step:&lt;/p&gt;

&lt;pre&gt;$ sudo iptables-save &amp;gt; iptables.up.rules
$ sudo mv iptables.up.rules /etc/iptables.up.rules&lt;/pre&gt;

&lt;p&gt;Use your favorite text editor to open the file we just created &lt;strong&gt;/etc/iptables.up.rules&lt;/strong&gt; it should look like the one below:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# Generated by iptables-save v1.6.0 on Thu Dec 28 12:35:47 2017
*filter
:INPUT ACCEPT [3153:549434]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [2890:317837]
COMMIT
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Replace the COMMIT command with the text below:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# Don&apos;t forward traffic
-P FORWARD DROP

# Allow outgoing traffic
-P OUTPUT ACCEPT

# Allow established traffic
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow localhost traffic
-A INPUT -i lo -j ACCEPT

#############################
#  MANAGEMENT RULES
#############################
# Allow SSH (alternate port)
-A INPUT -p tcp --dport 22 -j ACCEPT

#############################
#  ACCESS RULES
#############################
# Allow web server
-A INPUT -p udp --dport 80 -j ACCEPT 
-A OUTPUT -p udp --sport 80 -j ACCEPT
-A INPUT -p tcp --dport 80 -j ACCEPT 
-A OUTPUT -p tcp --sport 80 -j ACCEPT

-A INPUT -p tcp --dport 443 -j ACCEPT 
-A OUTPUT -p tcp --sport 443 -j ACCEPT
-A INPUT -p udp --dport 443 -j ACCEPT 
-A OUTPUT -p udp --sport 443 -j ACCEPT

# Allow ping to 192.168.0.103
-A INPUT -p icmp --icmp-type 8 -s 0/0 -d 192.168.0.103 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -p icmp --icmp-type 0 -s 192.168.0.103 -d 0/0 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow DNS

# for 46.249.76.212

-A OUTPUT -p udp -o eth0 -d 46.249.76.212 --sport 53 -j ACCEPT
-A OUTPUT -p udp -o eth0 -d 46.249.76.212 --dport 53 -j ACCEPT
-A INPUT -p udp -i eth0 -s 46.249.76.212 --sport 53 -j ACCEPT
-A INPUT -p udp -i eth0 -s 46.249.76.212 --dport 53 -j ACCEPT

# home - this section allows access to and from your internal network
-A OUTPUT -p udp -o eth0 -m iprange --dst-range 192.168.0.1-192.168.0.254 --sport 53 -j ACCEPT
-A OUTPUT -p udp -o eth0 -m iprange --dst-range 192.168.0.1-192.168.0.254 --dport 53 -j ACCEPT
-A INPUT -p udp -i eth0 -m iprange --src-range 192.168.0.1-192.168.0.254 --sport 53 -j ACCEPT
-A INPUT -p udp -i eth0 -m iprange --src-range 192.168.0.1-192.168.0.254 --dport 53 -j ACCEPT

# Allow NTP Assuming you are a CLIENT and want to access NTP servers you&apos;d do:
-A OUTPUT -p udp --dport 123 -j ACCEPT 
-A INPUT -p udp --sport 123 -j ACCEPT

# Assuming you want to be a server, you&apos;d do
-A INPUT -p udp --dport 123 -j ACCEPT 
-A OUTPUT -p udp --sport 123 -j ACCEPT

#############################
#  DEFAULT DENY
#############################
-A INPUT -j DROP
COMMIT
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Run this command to apply the new rules and check if they are working as expected:&lt;/p&gt;

&lt;pre&gt;sudo /sbin/iptables-restore &amp;lt; /etc/iptables.up.rules&lt;/pre&gt;

&lt;p&gt;If there are no errors and you are not disconnected from the system we should be all set.&lt;/p&gt;

&lt;p&gt;Now we need to make sure the iptables rules are loaded after the system is restarted.&lt;/p&gt;

&lt;p&gt;To do so go to &lt;strong&gt;/etc/network/if-pre-up.d/&lt;/strong&gt; and create a file named &lt;strong&gt;iptables&lt;/strong&gt;, this is a bash file that will be executed before each network connection,
the content of this file should be as below:&lt;/p&gt;

&lt;pre&gt;#!/bin/sh
sudo /sbin/iptables-restore &amp;lt; /etc/iptables.up.rules&lt;/pre&gt;

&lt;p&gt;You’ll also need to make sure that the file &lt;strong&gt;iptables&lt;/strong&gt; have executable permissions:&lt;/p&gt;

&lt;pre&gt;sudo chmod +x iptables&lt;/pre&gt;

&lt;p&gt;Everything should be configured now, restart your system to make sure the rules are loaded properly.&lt;/p&gt;

</description>
        <pubDate>Sat, 20 Jan 2018 00:00:00 +0000</pubDate>
        <link>/linux/iptables-exmple/</link>
        <guid isPermaLink="true">/linux/iptables-exmple/</guid>
        
        
        <category>linux</category>
        
      </item>
    
      <item>
        <title>Live Webcam Feeds</title>
        <description>&lt;h1 id=&quot;collection-of-sites-offering-free-live-webcamera-feeds-from-around-the-world&quot;&gt;Collection of sites offering free live webcamera feeds from around the world&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;/static/img/ip-camera.png&quot; alt=&quot;Public Ip Cameras&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;http://www.webcamhopper.com/&quot; target=&quot;_blank&quot;&gt;webcamhopper.com&lt;/a&gt; - Live Webcams from Around the World&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.lookr.com/&quot; target=&quot;_blank&quot;&gt;lookr.com&lt;/a&gt; - Explore &amp;amp; Enjoy Beautiful Places&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;http://www.earthcam.com/&quot; target=&quot;_blank&quot;&gt;earthcam.com&lt;/a&gt; - EarthCam is the leading network of live webcams and offers the most comprehensive search engine of internet cameras from around the world.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;http://weather-webcam.eu/&quot; target=&quot;_blank&quot;&gt;weather-webcam.eu&lt;/a&gt; -  Webcams from Bulgaria and all around Europe.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I love webcams and this is a list of the good web sites I have stumbled. If you know some other interesting sites, post them in the comments.&lt;/p&gt;

</description>
        <pubDate>Fri, 19 Jan 2018 00:00:00 +0000</pubDate>
        <link>/webcams/web-cameras/</link>
        <guid isPermaLink="true">/webcams/web-cameras/</guid>
        
        
        <category>webcams</category>
        
      </item>
    
      <item>
        <title>Software for Raspberry Pi</title>
        <description>&lt;h2 id=&quot;collection-of-software-for-raspberry-pi&quot;&gt;Collection of software for raspberry pi&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;http://www.pivpn.io/&quot; target=&quot;_blank&quot;&gt;PiVPN&lt;/a&gt; - Simplest OpenVPN setup and configuration, designed for Raspberry Pi.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;http://pi-hole.net/&quot; target=&quot;_blank&quot;&gt;Pi-Hole&lt;/a&gt; - black hole for Internet advertisements.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/AdguardTeam/AdGuardHome#getting-started&quot; target=&quot;_blank&quot;&gt;AdGuard&lt;/a&gt; - good alternative to Pi-Hole but not open source.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://home-assistant.io/&quot; target=&quot;_blank&quot;&gt;Home Assistant&lt;/a&gt; - open-source home automation platform running on Python 3. Track and control all devices at home and automate control. Installation in less than a minute.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;http://www.instructables.com/id/Turn-any-printer-into-a-wireless-printer-with-a-Ra/?ALLSTEPS&quot; target=&quot;_blank&quot;&gt;CUPS&lt;/a&gt; - Turn any printer into a wireless printer with a Raspberry Pi&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

</description>
        <pubDate>Fri, 19 Jan 2018 00:00:00 +0000</pubDate>
        <link>/raspberry-pi/rpi-software/</link>
        <guid isPermaLink="true">/raspberry-pi/rpi-software/</guid>
        
        
        <category>raspberry-pi</category>
        
      </item>
    
      <item>
        <title>Collection of free software for Windows</title>
        <description>&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;http://www.yawcam.com/&quot; target=&quot;_blank&quot;&gt;Yawcam&lt;/a&gt; - is a webcam software for Windows written in Java.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;http://www.ispyconnect.com/&quot; target=&quot;_blank&quot;&gt;iSpy&lt;/a&gt; -  is our free, open source video surveillance platform.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://winscp.net/&quot; target=&quot;_blank&quot;&gt;WinSCP&lt;/a&gt; - WinSCP is an open source free SFTP client, FTP client, WebDAV client and SCP client for Windows.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;http://www.9bis.net/kitty/&quot; target=&quot;_blank&quot;&gt;KiTTY&lt;/a&gt; - KiTTY is a fork from version 0.67 of PuTTY, the best telnet / SSH client in the world. KiTTY is only designed for the Microsoft Windows platform.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://filezilla-project.org/&quot; target=&quot;_blank&quot;&gt;FileZilla&lt;/a&gt; - the free FTP solution. Both a client and a server are available.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;http://www.voidtools.com&quot; target=&quot;_blank&quot;&gt;Everything&lt;/a&gt; - Locate files and folders by name instantly. You can use everything to run a readonly ftp or http server that will share your data.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://inkscape.org&quot; target=&quot;_blank&quot;&gt;Inkscape&lt;/a&gt; - is a professional vector graphics editor for Windows, Mac OS X and Linux. It’s free and open source.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;http://virtualdub.org/&quot; target=&quot;_blank&quot;&gt;VirtualDub&lt;/a&gt; - is a video capture/processing utility for 32-bit and 64-bit Windows platforms (98/ME/NT4/2000/XP/Vista/7)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;http://openhardwaremonitor.org/&quot; target=&quot;_blank&quot;&gt;Open Hardware Monitor&lt;/a&gt; - is a free open source software that monitors temperature sensors, fan speeds, voltages, load and clock speeds of a computer.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://notepad-plus-plus.org/&quot; target=&quot;_blank&quot;&gt;Notepad++&lt;/a&gt; - is a free (as in “free speech” and also as in “free beer”) source code editor and Notepad replacement that supports several languages.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://calibre-ebook.com/&quot; target=&quot;_blank&quot;&gt;Calibre&lt;/a&gt; - is a free and open source e-book library management application developed by users of e-books for users of e-books. It has a cornucopia of features divided into the following main categories:&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;http://www.7-zip.org/&quot; target=&quot;_blank&quot;&gt;7-Zip&lt;/a&gt; - is a file archiver with a high compression ratio.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://code.google.com/archive/p/squeezelite/downloads&quot; target=&quot;_blank&quot;&gt;Squeezelite&lt;/a&gt; - lightweight headless Squeezebox emulator&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://rufus.akeo.ie/&quot; target=&quot;_blank&quot;&gt;Rufus&lt;/a&gt; - Create bootable USB drives the easy way&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://sourceforge.net/projects/win32diskimager/&quot; target=&quot;_blank&quot;&gt;Win32 Disk Imager&lt;/a&gt; - This program is designed to write a raw disk image to a removable device or backup a removable device to a raw image file.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;http://www.ridgecrop.demon.co.uk/index.htm?guiformat.htm&quot; target=&quot;_blank&quot;&gt;FAT32 Format&lt;/a&gt; - Format parttions bigger than 32 GB with FAT32&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.sdcard.org/downloads/formatter_4/&quot; target=&quot;_blank&quot;&gt;SD Card Formatter&lt;/a&gt; - The SD Card Formatter was created specifically for memory cards using the SD/SDHC/SDXC standards.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;http://www.minitool.com/download-center/partition-manager-download.html&quot; target=&quot;_blank&quot;&gt;MiniTool Partition Wizard Free Edition&lt;/a&gt; - a free partition manager software designed by MiniTool Solution Ltd&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://ritchielawrence.github.io/cmdow/&quot; target=&quot;_blank&quot;&gt;Cmdow&lt;/a&gt; - Win32 commandline utility for NT4/2000/XP/2003/2008/7 that allows windows to be listed, moved, resized, renamed, hidden/unhidden, disabled/enabled, minimized, maximized, restored, activated/inactivated, closed, killed and more.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://nssm.cc/&quot; target=&quot;_blank&quot;&gt;NSSM&lt;/a&gt; - NSSM is a service helper program similar to srvany and cygrunsrv.  It can start any application as an NT service and will restart the service if it fails for any reason.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://androidmtk.com/download-minimal-adb-and-fastboot-tool&quot; target=&quot;_blank&quot;&gt;Minimal ADB and Fastboot Tool&lt;/a&gt; - The total installation of Minimal ADB and Fastboot tool is around 2 mb only (where as android sdk package takes more than 500 mb).&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

</description>
        <pubDate>Mon, 15 Jan 2018 00:00:00 +0000</pubDate>
        <link>/windows/free-windows-software/</link>
        <guid isPermaLink="true">/windows/free-windows-software/</guid>
        
        
        <category>windows</category>
        
      </item>
    
    
      <item>
        <title>Cool project 1</title>
        <description>Cool project 1</description>
        <link>#</link>
        <pubDate>Wed, 01 Jan 2014 00:00:00 +0000</pubDate>
        
        <category>Angular JS</category>
        
        <category>API</category>
        
      </item>
    
      <item>
        <title>Cool project 2</title>
        <description>Cool project 2</description>
        <link>#</link>
        <pubDate>Thu, 01 May 2014 00:00:00 +0000</pubDate>
        
        <category>Android</category>
        
        <category>PHP</category>
        
      </item>
    
      <item>
        <title>Cool project 3</title>
        <description>Cool project 3</description>
        <link>#</link>
        <pubDate>Sun, 01 Jun 2014 00:00:00 +0000</pubDate>
        
        <category>HTML</category>
        
        <category>JQuery</category>
        
        <category>PHP</category>
        
      </item>
    
      <item>
        <title>Cool project 4</title>
        <description>Cool project 4</description>
        <link></link>
        <pubDate>Sat, 01 Oct 2016 00:00:00 +0000</pubDate>
        
        <category>Android</category>
        
        <category>nodejs</category>
        
      </item>
    
  </channel>
</rss>
