<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>All Posts - JMS Blog</title><link>/posts/</link><description>All Posts | JMS Blog</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Thu, 02 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="/posts/" rel="self" type="application/rss+xml"/><item><title>Ollama as user systemd service</title><link>/posts/ollama-local/</link><pubDate>Thu, 02 Jul 2026 00:00:00 +0000</pubDate><author>jms</author><guid>/posts/ollama-local/</guid><description><![CDATA[<p>Sometimes I need a service to run when my user is logged in, otherwise the service can run
like the other services when the machine start, <code>systemd</code> can provide that functionality.</p>
<h2 id="ollama">Ollama</h2>
<p><code>Ollama</code> is one of the tools that allows you to run large language models locally. There are other tools like <code>Unsloth Studio</code>, <code>llama.cpp</code>, <code>LM Studio</code>, but <code>Ollama</code> is the simplest.</p>
<div class="details admonition note open">
    <div class="details-summary admonition-title">
        <i class="icon far fa-pen-to-square" aria-hidden="true"></i>Installation<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content"><div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-sh">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">curl -fsSL https://ollama.com/install.sh <span class="p">|</span> sh</span></span></code></pre></div></div>
<p>By default, running the installation script will attempt to create a user <code>ollama</code> and <code>systemd</code> unit file to run the service when the machine starts.</p>]]></description></item><item><title>Golang Password Generator</title><link>/posts/golang-password-generator/</link><pubDate>Wed, 01 Jul 2026 12:04:00 -0600</pubDate><author>jms</author><guid>/posts/golang-password-generator/</guid><description><![CDATA[<p>I continue learning Go, so this time I created a password generator to generate secure passwords that exclude ambiguous characters</p>
<h2 id="features">Features</h2>
<ul>
<li>Generate multiple passwords at once.</li>
<li>Customizable password length (minimum 8 characters).</li>
<li>Excludes ambiguous characters (e.g., <code>0</code>, <code>1</code>, <code>O</code>, <code>I</code>, <code>l</code>, <code>5</code>, <code>S</code>, <code>q</code>, <code>g</code>).</li>
<li>Memory efficient</li>
</ul>
<h2 id="implementation-details">Implementation Details</h2>
<p>To make the development easy and more maintainable creating a modern CLI tool I use <code>spf13/cobra</code>, Cobra framework and keep the dependencies at minimum with <code>crypto/rand</code> for cryptographically secure random number generation and <code>strings.Builder</code> for efficient string construction.</p>]]></description></item><item><title>Switching to i3wm from Gnome</title><link>/posts/2021-06-19-switch-to-i3/</link><pubDate>Sat, 19 Jun 2021 00:00:00 +0000</pubDate><author>jms</author><guid>/posts/2021-06-19-switch-to-i3/</guid><description>&lt;p>If you like the tiling window manager like i3wm and you want to switch from Gnome there are somethings missing like the network manager applet, the volume control, add/connect bluetooth devices and in some cases the gnome-keyring to handle passwords, private keys and certificates.&lt;/p>
&lt;p>To fix that, there are some config tweaks and programs that would make the switch to i3 better. For this i going to use Fedora 34&lt;/p></description></item><item><title>Timezone lookup using latitude and longitud (part 2)</title><link>/posts/2020-08-12-timezone-finder-2/</link><pubDate>Wed, 12 Aug 2020 00:00:00 +0000</pubDate><author>jms</author><guid>/posts/2020-08-12-timezone-finder-2/</guid><description><![CDATA[<p>For the fastapi project we are going to use Sqlalchemy and postgresql
taking some reference from the fastapi documentation.</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># create a virtualenv, with any tool: poetry, pipenv, virtualenv module, etc </span>
</span></span><span class="line"><span class="cl">pip install fastapi uvicorn aiofiles SQLAlchemy psycopg2-binary</span></span></code></pre></div></div>
<p>project structure</p>
<div class="code-block code-line-numbers" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">.
</span></span><span class="line"><span class="cl">├── Dockerfile
</span></span><span class="line"><span class="cl">├── LICENSE
</span></span><span class="line"><span class="cl">├── main.py
</span></span><span class="line"><span class="cl">├── README.md
</span></span><span class="line"><span class="cl">├── requirements.txt
</span></span><span class="line"><span class="cl">└── timezone_utils
</span></span><span class="line"><span class="cl">    ├── database.py
</span></span><span class="line"><span class="cl">    ├── __init__.py
</span></span><span class="line"><span class="cl">    ├── models.py
</span></span><span class="line"><span class="cl">    ├── schemas.py
</span></span><span class="line"><span class="cl">    └── utils.py
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="m">1</span> directory, <span class="m">10</span> files</span></span></code></pre></div></div>
<p>we define the models, schemas and engine for sqlalchemy and the api in the package <code>timezone_utils</code></p>]]></description></item><item><title>Timezone lookup using latitude and longitude (part 1)</title><link>/posts/2020-08-11-timezone-finder-1/</link><pubDate>Tue, 11 Aug 2020 00:00:00 +0000</pubDate><author>jms</author><guid>/posts/2020-08-11-timezone-finder-1/</guid><description><![CDATA[<p>First timezones are evil, but sometimes you need to work with them. Sometimes is easy to consume some third party api to get timezone information based on a given location using geocoding but there also exists some alternatives.</p>
<p>Then inspired on this <a href="https://github.com/evansiroky/timezone-boundary-builder" target="_blank" rel="noopener noreffer ">blog post</a> and the project <a href="https://github.com/evansiroky/timezone-boundary-builder" target="_blank" rel="noopener noreffer ">Timezone boundary builder</a> decided to create a test project using fastapi and postgis to do the timezone lookup using the latitude and longitude.</p>]]></description></item><item><title>Flask logging setup</title><link>/posts/2019-05-27-flask-logging/</link><pubDate>Mon, 27 May 2019 00:00:00 +0000</pubDate><author>jms</author><guid>/posts/2019-05-27-flask-logging/</guid><description><![CDATA[<p>Setup a python logging configuration with dictConfig</p>
<p>Logging configuration can be defined on different ways like a dict, ini file, yaml or json
somethimes is more flexible to do it on code with python, all depends on the use case.</p>
<p>This small example show how to setup the logging configuration using <code>dictConfig</code> method and how to add an user defined object to the logging filter.</p>
<div class="code-block code-line-numbers" style="counter-reset: code-block 0">
    <div class="code-header language-python">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">os</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">logging</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">socket</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">Flask</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">logging.config</span> <span class="kn">import</span> <span class="n">dictConfig</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">ContextFilter</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">Filter</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">hostname</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">gethostname</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">def</span> <span class="nf">filter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">record</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">record</span><span class="o">.</span><span class="n">hostname</span> <span class="o">=</span> <span class="n">ContextFilter</span><span class="o">.</span><span class="n">hostname</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="kc">True</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">logging_configuration</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">version</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">disable_existing_loggers</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">formatters</span><span class="o">=</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;default&#34;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&#34;format&#34;</span><span class="p">:</span> <span class="s2">&#34;[</span><span class="si">%(hostname)s</span><span class="s2"> </span><span class="si">%(asctime)s</span><span class="s2">] </span><span class="si">%(levelname)s</span><span class="s2"> in </span><span class="si">%(module)s</span><span class="s2">: </span><span class="si">%(message)s</span><span class="s2">&#34;</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="n">filters</span><span class="o">=</span><span class="p">{</span><span class="s2">&#34;hostname_filter&#34;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&#34;()&#34;</span><span class="p">:</span> <span class="n">ContextFilter</span><span class="p">}},</span>
</span></span><span class="line"><span class="cl">    <span class="n">handlers</span><span class="o">=</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;console&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="s2">&#34;class&#34;</span><span class="p">:</span> <span class="s2">&#34;logging.StreamHandler&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="s2">&#34;formatter&#34;</span><span class="p">:</span> <span class="s2">&#34;default&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="s2">&#34;filters&#34;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&#34;hostname_filter&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="n">root</span><span class="o">=</span><span class="p">{</span><span class="s2">&#34;handlers&#34;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&#34;console&#34;</span><span class="p">],</span> <span class="s2">&#34;level&#34;</span><span class="p">:</span> <span class="n">os</span><span class="o">.</span><span class="n">getenv</span><span class="p">(</span><span class="s2">&#34;LOG_LEVEL&#34;</span><span class="p">,</span> <span class="s2">&#34;INFO&#34;</span><span class="p">)},</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">dictConfig</span><span class="p">(</span><span class="n">logging_configuration</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">app</span> <span class="o">=</span> <span class="n">Flask</span><span class="p">(</span><span class="vm">__name__</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="vm">__name__</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@app.route</span><span class="p">(</span><span class="s2">&#34;/&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">home</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&#34;debug message&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&#34;info message&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">&#34;warning message&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">&#34;error message&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">logger</span><span class="o">.</span><span class="n">critical</span><span class="p">(</span><span class="s2">&#34;critical error message&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="s2">&#34;Hello World&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&#34;__main__&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">app</span><span class="o">.</span><span class="n">run</span><span class="p">()</span></span></span></code></pre></div></div>
<p>The filter <code>hostname_filter</code> use the special key <code>&quot;()&quot;</code> which means that user-defined instantiation is wanted. <code>ContextFilter</code> subclass <code>logging.Filter</code> and overrides the <code>filter</code> method so when key <code>hostname</code> is found it will get his value from the <code>ContextFilter</code> class using <code>socket.gethostname()</code> and the application output will show:</p>]]></description></item><item><title>Git sync forked repo</title><link>/posts/2018-04-07-git-sync-fork/</link><pubDate>Sat, 07 Apr 2018 00:00:00 +0000</pubDate><author>jms</author><guid>/posts/2018-04-07-git-sync-fork/</guid><description>&lt;p>Some git notes&lt;/p></description></item><item><title>Markdown Blog</title><link>/posts/2018-02-25-blog-setup/</link><pubDate>Sun, 25 Feb 2018 00:00:00 +0000</pubDate><author>jms</author><guid>/posts/2018-02-25-blog-setup/</guid><description><![CDATA[<p>For this blog, i&rsquo;ve setup a linux KVM vps, using as distro Fedora 27.
Fedora 27 comes with Selinux enforced security policy by default this is OK for
system or apps where you required a high security level, but for my case to serve a
static blog and run a couple of services like OpenSSH and Nginx is ok to set the security
policy on permissive mode.</p>
<p>changing the policy can be done via command or setup in permanent way on the selinux config
in <code>/etc/selinux/config</code></p>]]></description></item><item><title>Markdown Blog</title><link>/posts/2018-02-18-markdown-blog/</link><pubDate>Sun, 18 Feb 2018 00:00:00 +0000</pubDate><author>jms</author><guid>/posts/2018-02-18-markdown-blog/</guid><description>&lt;p>There are many reasons and options to choose a static site generator,
but the main reasons are speed and security. Speed because it can allow more control
over the content you only load what is really required without additional
server side content, for security not having a database that can be compromised and
security updates to apply, reduce the attack vectors and the administration work.&lt;/p>
&lt;p>There are many options for static site generators created on diferent languages like:&lt;/p></description></item><item><title>Checking and validating phone numbers</title><link>/posts/2015-06-09-checking-and-validating-phone-numbers/</link><pubDate>Tue, 09 Jun 2015 00:00:00 +0000</pubDate><author>jms</author><guid>/posts/2015-06-09-checking-and-validating-phone-numbers/</guid><description><![CDATA[<p>In applications sometimes is needed check and verify if a phone number is
valid or possible if the number have all required digits to be valid for this
purpose there are several options to tackle the problem like regular
expressions for example to validate <a href="http://en.wikipedia.org/wiki/E.164" target="_blank" rel="noopener noreffer ">E.164
format</a>, library like the [Google
libphonenumber](http://Google libphonenumber) and API like the <a href="https://www.twilio.com/lookup" target="_blank" rel="noopener noreffer ">Twillio
Lookup</a> for something more complete.</p>
<p>for this post i created a small app for test a demo purpose using the [python
port of the Google library](<a href="https://github.com/daviddrysdale/python-" target="_blank" rel="noopener noreffer ">https://github.com/daviddrysdale/python-</a>
phonenumbers)</p>]]></description></item></channel></rss>