<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.0.1">Jekyll</generator><link href="https://arpnetworks.com/blog/feed.xml" rel="self" type="application/atom+xml" /><link href="https://arpnetworks.com/blog/" rel="alternate" type="text/html" /><updated>2026-04-20T18:46:33-07:00</updated><id>https://arpnetworks.com/blog/feed.xml</id><title type="html">Technology Blog</title><subtitle>The official blog of ARP Networks</subtitle><author><name>Garry Dolley</name></author><entry><title type="html">How to Install Hugo in 2 Minutes</title><link href="https://arpnetworks.com/blog/2024/11/01/how-to-install-hugo-in-2-minutes.html" rel="alternate" type="text/html" title="How to Install Hugo in 2 Minutes" /><published>2024-11-01T10:00:00-07:00</published><updated>2024-11-01T10:00:00-07:00</updated><id>https://arpnetworks.com/blog/2024/11/01/how-to-install-hugo-in-2-minutes</id><content type="html" xml:base="https://arpnetworks.com/blog/2024/11/01/how-to-install-hugo-in-2-minutes.html"><![CDATA[<p>This evening I was experimenting with static site generators.  I’ve been using <a href="https://jekyllrb.com">Jekyll</a> for a while, but I wanted to see what other options were available.  I decided to give <a href="https://gohugo.io">Hugo</a> a try, since I heard it’s very fast and some of the themes are really nice.  Hugo is written in Go, so it’s a single binary that you download and run, which generally makes it easier to install than something like Jekyll, which requires Ruby and quite a few other dependencies.</p>

<p>As I run Arch Linux on my desktop, I’ll show you how to get it up and running on Arch Linux in just a couple of minutes.</p>

<h2 id="installation">Installation</h2>

<p>Installing Hugo on Arch Linux is straightforward using pacman:</p>

<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nv">$ </span><span class="nb">sudo </span>pacman <span class="nt">-S</span> hugo</code></pre></figure>

<p>That’s it! To verify the installation:</p>

<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nv">$ </span>hugo version</code></pre></figure>

<p>At the time of this writing, the version that was installed on my Arch Linux system was as follows:</p>

<figure class="highlight"><pre><code class="language-shell" data-lang="shell">hugo v0.136.3+extended linux/amd64 <span class="nv">BuildDate</span><span class="o">=</span>unknown</code></pre></figure>

<h2 id="quick-start">Quick Start</h2>

<p>Let’s create a new site:</p>

<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nv">$ </span>hugo new site myblog
<span class="nv">$ </span><span class="nb">cd </span>myblog</code></pre></figure>

<p>Add a theme (using PaperMod as an example):</p>

<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nv">$ </span>git init
<span class="nv">$ </span>git submodule add https://github.com/adityatelange/hugo-PaperMod themes/PaperMod</code></pre></figure>

<p>Enable the theme by adding the following line to the end of <code class="highlighter-rouge">hugo.toml</code>:</p>

<figure class="highlight"><pre><code class="language-toml" data-lang="toml"><span class="py">theme</span> <span class="p">=</span> <span class="s">"PaperMod"</span></code></pre></figure>

<p>By this point, your <code class="highlighter-rouge">hugo.toml</code> file should look like this:</p>

<figure class="highlight"><pre><code class="language-toml" data-lang="toml"><span class="py">baseURL</span> <span class="p">=</span> <span class="s">"http://example.org/"</span>
<span class="py">languageCode</span> <span class="p">=</span> <span class="s">"en-us"</span>
<span class="py">title</span> <span class="p">=</span> <span class="s">"My New Hugo Site"</span>
<span class="py">theme</span> <span class="p">=</span> <span class="s">"PaperMod"</span></code></pre></figure>

<p>Create your first post:</p>

<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nv">$ </span>hugo new posts/my-first-post.md</code></pre></figure>

<p>Start the Hugo development server:</p>

<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nv">$ </span>hugo server <span class="nt">-D</span></code></pre></figure>

<p>Visit http://localhost:1313 to see your new site!</p>

<p>Here’s a screenshot of what the site looks like for me:</p>

<p><img src="/blog/assets/images/hugo-blank-slate.jpg" alt="Hugo Site Preview" /></p>

<p>My system is set to dark mode, so the theme is styled accordingly.  There’s a theme toggle next to the logo in the top left.</p>

<p>That’s all there is to it. Hugo is now installed and ready for you to start creating content. The <code class="highlighter-rouge">-D</code> flag tells Hugo to include draft posts in the preview.</p>

<p>For more information about Hugo’s features and capabilities, check out the <a href="https://gohugo.io/documentation/">official documentation</a>.</p>]]></content><author><name>Garry Dolley</name></author><category term="hugo" /><category term="archlinux" /><category term="linux" /><category term="blog" /><summary type="html"><![CDATA[A quick guide to installing the Hugo static site generator on Arch Linux]]></summary></entry><entry><title type="html">Using HP iLO2 Remote Console on Linux in 2020</title><link href="https://arpnetworks.com/blog/2020/01/29/using-hp-ilo2-remote-console-on-arch-linux.html" rel="alternate" type="text/html" title="Using HP iLO2 Remote Console on Linux in 2020" /><published>2020-01-29T13:18:41-08:00</published><updated>2020-01-29T13:18:41-08:00</updated><id>https://arpnetworks.com/blog/2020/01/29/using-hp-ilo2-remote-console-on-arch-linux</id><content type="html" xml:base="https://arpnetworks.com/blog/2020/01/29/using-hp-ilo2-remote-console-on-arch-linux.html"><![CDATA[<h2 id="overview">Overview</h2>

<p>This one really frustrated me, but I knew I had to find a solution, and
it wasn’t going to be “Run Windows in a VM on your laptop.”  That just
sounded stupid.  But nevertheless, as our technology advances and
support for old Java applets wanes, getting esoteric things like an iLO2
video console working on Linux in 2020 seems next to impossible.</p>

<p>This wasn’t so much of an issue with my old laptop, a ThinkPad T520
running an old version of Ubuntu, namely Trusty (14.04).  Before you
judge me, let me just say, I use laptops like old Toyotas; I don’t
replace them until they are damn near falling apart.  Really, that tried
and true T520 had an “A” key that would sometimes pop off…</p>

<p>And while I could have just gone to my closet and pulled out this old
laptop, just to access the console of one of our old HP servers, just
<em>this one time</em>, I really wanted to have a modern solution.  So, I went
down this rabbit hole, burned a few hours, but ultimately was successful
and I am proud to share what I discovered.</p>

<p>First things first, I can’t even login to an iLO2 remote management
service at all in today’s Chrome, it’ll complain about SSL and quit with
<code class="highlighter-rouge">ERR_SSL_BAD_RECORD_MAC_ALERT</code>, so using Chrome is out of the picture.</p>

<p>It works fine in Firefox though; I can login and use most of the tools,
except for the Java-based remote console.  As of September, 2018,
Firefox <a href="https://java.com/en/download/faq/firefox_java.xml">dropped
support</a> for the
technology to run Java applets.</p>

<p>So if you’re running a modern Firefox, you’re shit-out-of-luck.
However, there is good news.  You can install and run an older version
of Firefox, from the ESR line (Extended Support Release), and support
for Java applets will be there, and the iLO2 console will work.  You’ll
need an ESR version up to or below 52ESR, and then an old version of
Java 7, and I’ll show you below how to get all those things working on
Arch Linux (my preferred desktop OS on my ThinkPad X1 Carbon).</p>

<h2 id="install-firefox-esr">Install Firefox ESR</h2>

<p>This part is not so bad, but you’ll have to edit your <code class="highlighter-rouge">PKGBUILD</code> a bit
because the latest ESR version at the time of this writing is too new.
You need 52 or below.  I use <code class="highlighter-rouge">trizen</code> for my AUR packages.  If you’re
using something else, you’ll have to adapt my method below to your
prefered tool.</p>

<ul>
  <li>
    <p>Install Firefox ESR (binary)</p>

    <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="nv">$ </span>trizen <span class="nt">-S</span> firefox-esr-bin
</code></pre></div>    </div>
  </li>
  <li>
    <p>Edit <code class="highlighter-rouge">PKGBUILD</code></p>

    <p>You will want to edit the <code class="highlighter-rouge">PKGBUILD</code> file according to the diff below.</p>

    <div class="language-diff highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gd">--- PKGBUILD    2019-12-23 04:57:07.070017439 -0800
</span><span class="gi">+++ PKGBUILD-new        2019-12-23 04:58:52.850018080 -0800
</span><span class="p">@@ -7,7 +7,7 @@</span>

 pkgname=firefox-esr-bin
 _pkgname=${pkgname/-bin/}
<span class="gd">-pkgver=68.3.0
</span><span class="gi">+pkgver=52.6.0
</span> pkgrel=1
 pkgdesc='Standalone web browser from mozilla.org - Extended Support Release'
 url='http://www.mozilla.org/en-US/firefox/organizations/'
<span class="p">@@ -18,22 +18,23 @@</span>
 license=('MPL' 'GPL' 'LGPL')
 install=$_pkgname.install

-sha512sums=('aadfdd64f10d5f9b97dda227793a6db3b73913f986c2f826ddcc3568f9a9e63ad3fe73d04dcb2cfe27ab854ef048faef3546621b3de731f5a5478c7c551df33a'
<span class="gi">+sha512sums=('b521611ace3731aea3e1cc7abb74f01a4885f5325da359a25a6a295316541c4e1e4cb7cf1be104cbb199acc15d57eeb8a37e2e8adf4e53f7ddf284f9d81a047f'
</span>             'c585f6e8ac7abfc96ad4571940b6f0dcc3f7331a18a518b4fe5d19b45e4c2d96c394524ea5c115c8fdd256c9229ea2fabeb1fc04ca7102f1626fd20728aef47d'
             'ab2fa2e08c7a65ac0bfe169a4b579e54b038bddabf838cd3df5ab341bd77be7c101092d0123598944d2174ab3a8fbc70dfbd692b2944016efdb7a69216a74428')
 [[ "$CARCH" == "i686" ]] &amp;&amp; sha512sums[0]='cb72fa6f7a6106fefa124dfdc2f8dc6df26a27defeb93d5683f744eb47343cdfb5e39727b16678f479c57a05d09d9358a811950d42635f57bba2cf0e94ed8412'

     ln -s /opt/$_pkgname/firefox $pkgdir/usr/bin/$_pkgname
     install -m644 $srcdir/{$_pkgname.desktop,$_pkgname-safe.desktop} $pkgdir/usr/share/applications/
<span class="gd">-       install -m644 $srcdir/firefox/browser/chrome/icons/default/default128.png $pkgdir/usr/share/pixmaps/$_pkgname.png
</span><span class="gi">+       install -m644 $srcdir/firefox/browser/chrome/icons/default/default48.png $pkgdir/usr/share/pixmaps/$_pkgname.png
</span> }
</code></pre></div>    </div>

    <p>With the above changes, we accomplish the following:</p>

    <ol>
      <li>Downgrade the Firefox version</li>
      <li>
        <p>Insert the correct SHA512 checksum for the downgraded binary
package</p>

        <p>For reference, I found the SHA512SUM for the binary file by
painstakingly looking for the correct version, architecture and
language in the
<a href="https://ftp.mozilla.org/pub/firefox/releases/52.6.0esr/SHA512SUMS">SHA512SUMS</a>
file for the release we’re trying to install.</p>
      </li>
      <li>Don’t ask me why that icon isn’t there.</li>
    </ol>
  </li>
  <li>
    <p>Build the package</p>

    <p>If everything goes smooth with your changes above, the Firefox ESR
binary package will be built and when you’re prompted to install it,
just proceed to do so.</p>

    <p>If things <em>don’t</em> go smoothly and you need to try again, see the next
section.</p>
  </li>
  <li>
    <p><strong>OPTIONAL</strong>: How to retry the build if things go wrong</p>

    <p>If something goes wrong, you can save time by going into the build
directory, tweaking anything you need, and building again manually as
follows:</p>

    <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">cd</span> /tmp/trizen-<span class="nv">$USER</span>/firefox-esr-bin

<span class="c"># Make tweaks, etc...</span>

<span class="nv">$ </span>makepkg
</code></pre></div>    </div>

    <p>Once <code class="highlighter-rouge">makepkg</code> completes successfully, you’ll have a package file that
Arch Linux can install using regular ol’ pacman:</p>

    <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">sudo </span>pacman <span class="nt">-U</span> firefox-esr-bin-52.6.0-1-x86_64.pkg.tar.xz
</code></pre></div>    </div>
  </li>
</ul>

<h2 id="install-the-java-7-runtime-environment-jre7">Install the Java 7 Runtime Environment (JRE7)</h2>

<p>To install an old version of the Oracle Java 7 Runtime Environment,
which is EOL (end of life / support), perform the steps below.  Note
though, that the first part will fail, and that is normal.  It’s because
Oracle doesn’t let you <em>just download</em> the Java runtimes, you have to
agree to their license, or terms, or something legal that nobody cares
about but the lawyers.</p>

<p>But not only that, you have to login to Oracle’s site.  This is annoying
but not necessarily an obstacle, because you can sign up for a free
account right on the spot.</p>

<ul>
  <li>
    <p>Install JRE7 package</p>

    <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="nv">$ </span>trizen <span class="nt">-S</span> jre7
</code></pre></div>    </div>

    <p>This will fail, as noted above, but you’ll get the directory structure
in place that you need for the remaining steps in this section.</p>
  </li>
  <li>
    <p>Download JRE7 runtime from Oracle’s site</p>

    <p>The trizen command above will tell you which URL to go to (I would
have pasted it here, but I honestly forgot it).  Once there, you’ll
want to get the file: <code class="highlighter-rouge">jre-7u80-linux-x64.tar.gz</code></p>

    <p>When you try to download this file, it’ll make you go through a dance
of accepting something legal, signing up for a free Oracle account,
etc…</p>

    <p>It sucks, but just accept the pain.</p>

    <p>Once you finally have the file, proceed to the next step.</p>
  </li>
  <li>
    <p>Install JRE7 package (again)</p>

    <p>Now you can perform the following:</p>

    <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">cp</span> ~/Downloads/jre-7u80-linux-x64.tar.gz ~/trizen-<span class="nv">$USER</span>/jre7/
<span class="nv">$ </span>trizen <span class="nt">-S</span> jre7
</code></pre></div>    </div>

    <p>This should complete successfully now and you’ll have a working
version of the old Java 7 runtime.</p>
  </li>
</ul>

<h2 id="add-ilo2-to-the-security-exceptions">Add iLO2 to the Security Exceptions</h2>

<p>This will help with you not getting blasted with a million popups about
security problems.</p>

<ul>
  <li>
    <p>Start the Java Control Panel</p>

    <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="nv">$ </span>/usr/lib/jvm/java-7-jre/jre/bin/ControlPanel
</code></pre></div>    </div>
  </li>
  <li>
    <p>Confirm exceptions</p>

    <p>Navigate to: <code class="highlighter-rouge">Security</code> -&gt; <code class="highlighter-rouge">Edit Site List</code></p>

    <p>Add your iLO2 server URLs to the list.  For example,
<em>https://192.168.1.2</em></p>
  </li>
</ul>

<h2 id="configure-jre7-for-firefox">Configure JRE7 for Firefox</h2>

<p>Note: I didn’t actually have to do this step, the symlink was already
present.  But for completeness, I’m including this part because the
<a href="#references">reference</a> I used as a guide for this whole madness also included it,
so…</p>

<ul>
  <li>
    <p>Manual symlink (optional)</p>

    <p>You only need to perform this step if the symlink isn’t already present.</p>

    <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="nv">$ </span><span class="nb">cd</span> /usr/lib/mozilla/plugins
  <span class="nv">$ </span><span class="nb">sudo rm </span>libnpjp<span class="k">*</span>
  <span class="nv">$ </span><span class="nb">sudo ln</span> <span class="nt">-s</span> /usr/lib/jvm/java-7-jre/jre/lib/amd64/libnpjp2.so
</code></pre></div>    </div>
  </li>
</ul>

<h2 id="run-firefox-esr">Run Firefox ESR</h2>

<ul>
  <li>
    <p>Execute the correct binary</p>

    <p>This part may seem obvious, but I would like to point out one caveat I
found.  First of all, to run Firefox ESR, just execute the following:</p>

    <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>firefox-esr
</code></pre></div>    </div>

    <p><em>But</em>, if you have the regular version of Firefox already installed,
this might actually end up simply running <em>that</em> version, by default,
and I don’t really know why.  This happened to me a couple times and I
didn’t even notice at first.  Eventually, I ran the following instead:</p>

    <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>/opt/firefox-esr/firefox
</code></pre></div>    </div>

    <p>and <em>that</em> opened the right version.  Don’t ask me why.  The file
<code class="highlighter-rouge">/usr/bin/firefox-esr</code> simply symlinks to this one in <code class="highlighter-rouge">/opt</code> so it
<em>should</em> be the same, but whatever…</p>
  </li>
  <li>
    <p>Verify the Java plugin is installed</p>

    <p>Navigate to <code class="highlighter-rouge">about:addons</code></p>

    <p>You should see “Java(TM) Plug-in 10.80.2” in the list.</p>
  </li>
</ul>

<h2 id="open-ilo2">Open iLO2</h2>

<p>Open your iLO page as you normally would and start the remote console.
You may need to confirm further security exceptions.</p>

<p>If you get a <code class="highlighter-rouge">ClassNotFoundException</code>, don’t panic, just click once on
the applet where the remote console should be and it’ll download what it
needs.  I only had to do this once, then never again.</p>

<p>And that’s it!</p>

<p>You should see your server’s video console in your browser and you can
interact with it as you normally would, like in the old days, or on an
old laptop/desktop.</p>

<h2 id="a-better-way">A Better Way</h2>

<p>If you’re still with me, I thank you for your patience.  This process is
rather long and I wish accessing out-of-band consoles on physical
hardware wasn’t always such a pain in the ass.  Why can’t someone make a
decent remote console?!</p>

<p>One of the biggest reasons we developed our <a href="https://www.arpnetworks.com/dedicated">ARP Thunder™ Cloud
Dedicated Server</a> product several
years ago over at <a href="https://arpnetworks.com">ARP Networks</a> was to
provided a solution to this problem.  Get the resources of a dedicated
server, but be able to manage it with the ease of a virtual machine,
especially with regards to out-of-band (OOB) management.</p>

<p>With ARP Thunder™, you can get a video-based OOB management console by
simply clicking “View Console” in our
<a href="https://portal.arpnetworks.com">Portal</a>, which works in any modern web
browser without any plugins required.  You can also get a serial-based
OOB <a href="https://arpnetworks.com/vps/management-console">management console over
SSH</a>.</p>

<p>How cool is that?! :)</p>

<h2 id="references">References</h2>

<p>I owe much of my success in getting the iLO2 console working in Linux to
the following post: <a href="https://blog.wefixit.at/use-hp-ilo2-remote-console-with-linux-in-2018/">Use HP iLO2 Remote Console with Linux in 2018</a></p>]]></content><author><name>Garry Dolley</name></author><category term="ilo2" /><category term="archlinux" /><category term="linux" /><summary type="html"><![CDATA[How to use an old Firefox and Java to run the iLO2 Remote Video Console]]></summary></entry><entry><title type="html">4 Key Considerations for Outsourcing Web App Development</title><link href="https://arpnetworks.com/blog/consulting/2019/12/12/four-key-considerations-for-outsourcing-web-app-development.html" rel="alternate" type="text/html" title="4 Key Considerations for Outsourcing Web App Development" /><published>2019-12-12T14:28:38-08:00</published><updated>2019-12-12T14:28:38-08:00</updated><id>https://arpnetworks.com/blog/consulting/2019/12/12/four-key-considerations-for-outsourcing-web-app-development</id><content type="html" xml:base="https://arpnetworks.com/blog/consulting/2019/12/12/four-key-considerations-for-outsourcing-web-app-development.html"><![CDATA[<p>By outsourcing web app development, you can reduce project costs, improve
product quality, and shorten the time to market. These are just some of the
reasons why companies are turning to external talent to handle their IT
projects. But outsourcing is as much about the journey as it is about the
destination. There’s a lot more to think about than the price-quality ratio. To
get the best return on investment, you need to establish a thorough screening
process and look towards a long-term collaboration that doesn’t end the moment
a project is marked complete.</p>

<blockquote class="ludwig">
You need to look towards a long-term collaboration
</blockquote>

<p>Here are some of the most important considerations for developing a successful
outsourcing relationship:</p>

<h2 id="1-finalize-your-business-goals">1: Finalize your business goals</h2>

<p>As digital transformation becomes a key business driver in today’s
technology-focused world, companies are placing great importance on innovation.
But innovation is more than just a goal. It’s a complex set of evolving needs
based on current market conditions and existing business systems and processes.
A widespread lack of alignment between technological solutions and business
needs is one of the main reasons most digital transformations <a href="https://ceoworld.biz/2019/03/30/most-digital-transformations-fail-heres-how-to-change-that/">achieve disappointing results</a>.</p>

<p>When it comes to web app development, it’s crucial that you have a clear
picture of what you want to achieve. There must be a clear business need for it
in the first place. Before you start looking for an outsourcing partner, you
should have a finalized concept. This should include a general description of
your web product and a list of objectives associated with it, such as business
goals and technology requirements. Software development and project management
teams often summarize these factors in the form of a user story, which outlines
the who, what, and why of the project. Here’s an example: ‘As a customer, I
want a shopping cart that allows me to save items I can come back to later.’
This will allow you to develop a list of questions to ask in the screening
process and establish a realistic budget.</p>

<h2 id="2-find-the-right-team">2: Find the right team</h2>

<p>In many circles, outsourcing is still considered as a way of doing things on
the cheap with little regard to quality and support. While that can certainly
be the case if you choose your partners based on their prices alone,
outsourcing can help you overcome talent shortages by allowing you to tap into
the best knowledge and experience in the sector. However, finding the right
outsourcing partner is perhaps the hardest step of all. That’s why, before you
start scouring the freelance websites, developer blogs, and B2B directories,
you should make a shortlist of your requirements.</p>

<blockquote class="ludwig">
Finding the right outsourcing partner is perhaps the hardest step of all
</blockquote>

<p>One of the most important decisions is whether to outsource locally, nearshore,
or offshore. Offshore is the most popular outsourcing model where price is the
biggest concern, but it can also result in communications delays due to working
across multiple time zones and reduced project oversight. Outsourcing locally,
while undoubtedly the more expensive option, provides the benefit of complete
oversight and easier communications. A local company will also have a better
view of your target market and business needs compared to one the other side of
the world. Nearshoring often presents itself as a compromise between the two.</p>

<h2 id="3-select-the-best-service-model">3: Select the best service model</h2>

<p>When you’re outsourcing app development, it’s critical you choose the right
service model. All too often do businesses make the mistake of outsourcing a
project only to achieve the bare minimum and end up with an app fraught with
bugs and other issues. This is a common issue with outsourcing offshore or
hiring freelancers on the cheap through the bidding platforms. In many such
cases, there’s a complete lack of post-project support, which also means you
have to find a place to host your app and manage all the maintenance and
upgrades yourself.</p>

<blockquote class="ludwig">
In many cases, there’s a complete lack of post-project support, which means you have to host your app and manage the maintenance yourself.
</blockquote>

<p>Many service models are project-based, which means there’s a predefined goal
that the team needs to reach within a specified timeframe. This is ideal for
companies which have their own IT departments and are able to organize app
hosting and maintenance themselves. But if you don’t have your own team, you’ll
be better off choosing a dedicated outsourced partner which provides full-cycle
app development and post-project support. This gives businesses more control over
the process, making it ideal for those with very specific needs, such as
integrating existing business systems or adding complex functions which need
extensive testing.</p>

<p>You’ll also need to choose a suitable payment model. While the costs vary
widely depending on whether you’re outsourcing locally or offshore and which
service model you choose, you’ll need to maintain complete visibility into
ongoing costs. Fixed-price contracts are ideal for those with limited budgets
and where the scope of work is clear, but it can also be a major capital
expense. The pay-as-you-go model, which is popular among agile software
developers, offers much greater flexibility, making it ideal for more complex
projects which need ongoing support or are hard to determine the scope of in
advance.</p>

<h2 id="4-establish-efficient-communications">4: Establish efficient communications</h2>

<p>The most important component of any outsourcing relationship is also one many
businesses get wrong – communication. By now, most of us are familiar with the
barrage of complaints so many employees in IT have when trying to deal with a
disparate team of developers around the world, none of whom who are able to
work effectively as a team. Communications issues abound in such cases due to
factors like different time zones, lack of local expertise, and a lack of
familiarity with security and privacy regulations like the CCPA. While
communications tools like Slack and WhatsApp can go a long way towards
simplifying the process, relying on them entirely can result in serious
inefficiencies.</p>

<blockquote class="ludwig">
The ability to provide quick feedback is essential
</blockquote>

<p>It’s important that you choose the right collaboration tools and establish
communication needs from the outset. The ability to provide feedback is
essential when it comes to developing web projects. If there’s something you
don’t like about the direction of the project, it’s important the outsourced
partner knows about it immediately. Especially in the early stages of the
project, it’s strongly advisable that you hold daily meetings to ensure it gets
started on the right track. Every project should start with a planning meeting
that defines the scope of the work before meeting up at regular intervals
thereafter to synchronize progress. Once each milestone has been reached, there
should be a meeting to showcase the result and provide feedback.</p>

<h2 id="about-us">About Us</h2>

<p>We are a small team that believe in living our best lives.  Everyone
here is <strong>happy</strong>, <strong>growing</strong> and always <strong>learning</strong>.  As a result,
we provide the highest quality:</p>

<ul>
  <li>Hosting</li>
  <li>App development</li>
  <li>Cloud management</li>
  </ul>

<p>to our 500+ clients.</p>

<h2 id="start-your-project">Start Your Project</h2>

<blockquote class="ludwig">
Want to discuss your project with us?  
</blockquote>

<p>When you’re ready to start your project, we’re happy to help.  Contact
us any time either by phone (1-855-444-3145) or fill out the form below.</p>

<div class="_form_1"></div>
<script src="https://arpnetworks.activehosted.com/f/embed.php?id=1" type="text/javascript" charset="utf-8"></script>

<h2 id="terms">Terms</h2>

<p>A simple glossary that I didn’t want to crowd the article above, so I saved it
for the end.</p>

<p>The following are a list of terms used in this article and a definition for
each.  I felt this would be useful because the exact definition of certain
terms in the app development and web development space have become blurry (see,
it just happened right there).</p>

<dd>
  <dt>App Development</dt>
  <dl>

Typically, when one thinks of "apps," they think of mobile applications that
run on their phone.  As the transition from laptop/desktop usage to mobile
usage has increased over the years, the term "app" is increasingly become
ubiquitious with any kind of application, even if it doesn't exist on the
mobile device.  An app with a great responsive design and that runs well in a
mobile browser can often also be referred to as simply an "app", even though it
is not a native mobile app to the phone itself.  App development can refer to
the development of either kind of these applications by an individual, web
development company, or application development company.

  </dl>

  <dt>Application Development</dt>
  <dl>

See app development above.

  </dl>

  <dt>Development Services</dt>
  <dl>

The contracted services of a company whose expertise is app development,
whether it be mobile app development or web app development.

  </dl>

  <dt>Mobile App Development</dt>
  <dl>

See "Native Mobile App Development" below.

  </dl>

  <dt>Mobile Application</dt>
  <dl>

An app that is the end result of Native Mobile App Development (see below) and
can also be called simply a "native app" or "mobile app."

  </dl>

  <dt>Native Mobile App Development</dt>

  <dl>

Refers to app development that is targeted exclusively for a mobile device and
runs directly on that device without any "web" intermediary.  Native apps
typically run faster and can provide a better user experience than web
applications run simply within a mobile browser.

  </dl>

  <dt>Web Development</dt>
  <dl>

Typically refers to the development of applications that run in a web browser,
which is quite typical these days.  This term is not generally used to refer to
the development of native apps for mobile devices.

  </dl>
</dd>]]></content><author><name>Garry Dolley</name></author><category term="consulting" /><category term="software" /><category term="development" /><category term="apps" /><category term="outsourcing" /><summary type="html"><![CDATA[By outsourcing web app development, you can reduce project costs, improve product quality, and shorten the time to market]]></summary></entry><entry><title type="html">How To Update the Device Class on a Ceph OSD</title><link href="https://arpnetworks.com/blog/2019/06/28/how-to-update-the-device-class-on-a-ceph-osd.html" rel="alternate" type="text/html" title="How To Update the Device Class on a Ceph OSD" /><published>2019-06-28T15:28:38-07:00</published><updated>2019-06-28T15:28:38-07:00</updated><id>https://arpnetworks.com/blog/2019/06/28/how-to-update-the-device-class-on-a-ceph-osd</id><content type="html" xml:base="https://arpnetworks.com/blog/2019/06/28/how-to-update-the-device-class-on-a-ceph-osd.html"><![CDATA[<p>Several SAS OSDs in our Ceph cluster were replaced with faster SSDs
while re-using the old OSD IDs.  As of Luminous, the option to re-use an
OSD ID is available and it really speeds up the rebalancing.</p>

<p>The slight problem with re-using OSD IDs is that the old device class is
still in the CRUSH map and won’t automatically get updated because you
inserted different media.  Most of time this isn’t a problem, like if
you replace a spinning HDD with another spinning disk.  The device class
is the same and doesn’t need to change.</p>

<p>But, if you replace it with an SSD, for example, then you need to update
the device class manually.  The following is an example using a
ficticious OSD ID of 101:</p>

<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nv">$ OSD</span><span class="o">=</span>101

<span class="c"># Set new device class to "ssd"</span>
<span class="nv">$ </span>ceph osd crush rm-device-class osd.<span class="nv">$OSD</span>
<span class="nv">$ </span>ceph osd crush set-device-class ssd osd.<span class="nv">$OSD</span></code></pre></figure>

<p>It’s as simple as that!</p>]]></content><author><name>Garry Dolley</name></author><category term="ceph" /><summary type="html"><![CDATA[As of Luminous, the option to re-use an OSD ID accelerates rebalancing]]></summary></entry><entry><title type="html">ceph-volume lvm zap results in wipefs error and probing initialization failed: Device or resource busy</title><link href="https://arpnetworks.com/blog/2019/06/21/ceph-volume-zap-results-in-probing-initialization-failed-device-or-resource-busy.html" rel="alternate" type="text/html" title="ceph-volume lvm zap results in wipefs error and probing initialization failed: Device or resource busy" /><published>2019-06-21T23:26:49-07:00</published><updated>2019-06-21T23:26:49-07:00</updated><id>https://arpnetworks.com/blog/2019/06/21/ceph-volume-zap-results-in-probing-initialization-failed-device-or-resource-busy</id><content type="html" xml:base="https://arpnetworks.com/blog/2019/06/21/ceph-volume-zap-results-in-probing-initialization-failed-device-or-resource-busy.html"><![CDATA[<p>We were replacing a drive in our Ceph cluster and doing the usual
<code class="highlighter-rouge">ceph-volume zap</code> needed to wipe the new device when we were hit with
the following:</p>

<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo ceph-volume lvm zap /dev/sdg
Running command: /sbin/cryptsetup status /dev/mapper/
--&gt; Zapping: /dev/sdg
Running command: /sbin/wipefs --all /dev/sdg
 stderr: wipefs: error: /dev/sdg: probing initialization failed: Device or resource busy
--&gt;  RuntimeError: command returned non-zero exit status: 1
$
</code></pre></div></div>

<p>I haven’t seen this error too often.  It wasn’t a completely new drive,
but a used one.  After some investigation, turned out the MD subsystem
(Linux Software RAID) got a hold of it because it had an existing RAID
signature on it, and wouldn’t let it go.</p>

<p>To find out which RAID device was holding onto our drive, I did:</p>

<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ cat /proc/mdstat
Personalities : [raid1] [raid10] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] 
md127 : inactive sdg[0](S)
      1101784 blocks super external:ddf

...[snip]...

unused devices: &lt;none&gt;
$
</code></pre></div></div>

<p>I know it was <code class="highlighter-rouge">md127</code> because it included <code class="highlighter-rouge">inactive sdg</code>, which is
the name of our new device.</p>

<p>Now the fix was easy, we just had to stop and remove that superfluous
RAID volume, like so:</p>

<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo mdadm --stop /dev/md127
mdadm: stopped /dev/md127
$ sudo mdadm --remove /dev/md127
$
</code></pre></div></div>

<p>After that, the <code class="highlighter-rouge">ceph-volume lvm zap</code> command completed without error.</p>]]></content><author><name>Garry Dolley</name></author><category term="ceph" /><category term="lvm" /><category term="wipefs" /><summary type="html"><![CDATA[ceph-volume zap failed and here's how to fix it]]></summary></entry><entry><title type="html">systemd: The name org.freedesktop.PolicyKit1 was not provided by any .service files, or you just forgot sudo</title><link href="https://arpnetworks.com/blog/2019/06/20/the-name-org-freedesktop-policykit1-was-not-provided-by-any-service-files.html" rel="alternate" type="text/html" title="systemd: The name org.freedesktop.PolicyKit1 was not provided by any .service files, or you just forgot sudo" /><published>2019-06-20T17:30:53-07:00</published><updated>2019-06-20T17:30:53-07:00</updated><id>https://arpnetworks.com/blog/2019/06/20/the-name-org-freedesktop-policykit1-was-not-provided-by-any-service-files</id><content type="html" xml:base="https://arpnetworks.com/blog/2019/06/20/the-name-org-freedesktop-policykit1-was-not-provided-by-any-service-files.html"><![CDATA[<p>This is yet another good example of why I hate
<a href="https://en.wikipedia.org/wiki/Systemd">systemd</a>.  It has good intentions and
there are things it can do really well, but for the most part, it is an
extremely frustrating piece of software to use.  And for no good reason,
really.</p>

<p>Say you just issued the below command (like I was doing):</p>

<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>systemctl start ceph-osd@205
</code></pre></div></div>

<p>and were met with the following rebuttal:</p>

<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>The name org.freedesktop.PolicyKit1 was not provided by any .service files
</code></pre></div></div>

<p>You’re probably really scratching your head at this point…</p>

<p>The problem actually has <em>nothing</em> to do with <em>anything</em> the above error
states.  I simply forgot to use <code class="highlighter-rouge">sudo</code></p>

<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemctl start ceph-osd@205
</code></pre></div></div>

<p>and now everything is right with the world.</p>

<p>See what I mean?  Simply frustrating that one would be led so far off
the correct path right from the start.</p>]]></content><author><name>Garry Dolley</name></author><category term="ceph" /><summary type="html"><![CDATA[The most misleading error in the world]]></summary></entry><entry><title type="html">I moved my drives to a new server, now it won’t boot!</title><link href="https://arpnetworks.com/blog/2019/06/12/moved-drives-to-a-new-machine-now-my-server-wont-boot.html" rel="alternate" type="text/html" title="I moved my drives to a new server, now it won’t boot!" /><published>2019-06-12T13:47:23-07:00</published><updated>2019-06-12T13:47:23-07:00</updated><id>https://arpnetworks.com/blog/2019/06/12/moved-drives-to-a-new-machine-now-my-server-wont-boot</id><content type="html" xml:base="https://arpnetworks.com/blog/2019/06/12/moved-drives-to-a-new-machine-now-my-server-wont-boot.html"><![CDATA[<h2 id="the-problem">The Problem</h2>

<p>Recently, we had to move the drives of one server to another, seemingly
identical one, because the original one failed.  Once we had done so,
Linux would boot, but not find a root filesystem.  We were like, “wtf?!
…  It’s an identical server”</p>

<p>Well, it turned out, not exactly.  It was almost the same type, but this
newer one had a built-in Intel RAID controller and the SAS cables were
already routed to it.  Our drives were detected fine, and GRUB would
boot, but once Linux took over, it couldn’t see the disks at all.</p>

<p>It turned out our initramfs image did not have the drivers for this
particular controller (and why would it, the drives came from a server
where this controller was not present)</p>

<p>To fix this, we basically had to rebuild the initramfs image with the
correct driver.  The following is a description of the process.</p>

<h2 id="the-solution">The Solution</h2>

<p>First of all, we booted the new server with an <a href="https://archlinux.org">Arch
Linux</a> ISO.  In our experience, Arch Linux has
the best tools out-of-the-box and it is easy to get a shell right away
by just booting the regular ISO.</p>

<p>Once booted, we executed:</p>

<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mount /dev/md1 /mnt            # Our root was on md1
arch-chroot /mnt
mount -a                       # Mount everything else

# Change modules=dep to modules=all
vim /etc/initramfs-tools/initramfs.conf

update-initramfs -u -k all     # Or use -k &lt;version&gt; if your boot partition is small

sync
exit

reboot
</code></pre></div></div>

<p>After this, the new server booted perfectly!</p>]]></content><author><name>Garry Dolley</name></author><category term="server" /><category term="raid" /><category term="intel" /><category term="grub" /><summary type="html"><![CDATA[We moved drives from one server to another, but new one wouldn't boot]]></summary></entry><entry><title type="html">LSI 9211-8i SAS Controller Spins at ‘Initializing…’ Forever</title><link href="https://arpnetworks.com/blog/2017/03/17/lsi-9211-8i-spins-at-initializing-forever.html" rel="alternate" type="text/html" title="LSI 9211-8i SAS Controller Spins at ‘Initializing…’ Forever" /><published>2017-03-17T17:41:56-07:00</published><updated>2017-03-17T17:41:56-07:00</updated><id>https://arpnetworks.com/blog/2017/03/17/lsi-9211-8i-spins-at-initializing-forever</id><content type="html" xml:base="https://arpnetworks.com/blog/2017/03/17/lsi-9211-8i-spins-at-initializing-forever.html"><![CDATA[<p>We had this issue when popping an LSI 9211-8i SAS controller into an HP
Proliant DL180se G6.  After the little LSI <a href="https://www.instagram.com/p/BRPCnHBhodG/">splash
screen</a> <sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup> appeared after
POST, it goes into:</p>

<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Initializing..\
</code></pre></div></div>

<p>With the last character spinning… and spinning… forever.</p>

<p>I tried everything to get the thing going:</p>

<ul>
  <li>Updated LSI firmware to latest P20 (IT mode, was previously in IR mode)</li>
  <li>Flashed LSI firmware without BIOS ROM (so this screen is bypassed altogether) <sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">2</a></sup></li>
  <li>Updated HP Proliant DL180se G6 <a href="https://www.instagram.com/p/BRZVWRlBvM1/">backplane firmware</a></li>
  <li>Attempted to disable option ROM for the card in the BIOS (non-existent)</li>
  <li>Tried putting the card into every slot and PCI riser combination
possible</li>
  <li>Replaced HP mini-SAS to mini-SAS cable with an aftermarket more “generic” one</li>
</ul>

<p>At the end of the day, the fix was simply to disconnect the I2C cable
going from the backplane to the motherboard.  So simple, yet… so…
ggaahh!!</p>

<p>Footnotes:</p>

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1" role="doc-endnote">
      <p>The adapter malfunctioning error in this screenshot is non-related to this post; I just wanted to show the splash screen. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:2" role="doc-endnote">
      <p>This <em>does</em> get the machine to at least boot correctly, without any delays, but no drives are detected in Linux. <a href="#fnref:2" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name>Garry Dolley</name></author><category term="lsi" /><category term="sas" /><summary type="html"><![CDATA[How we solved the spinning "Initializing..." problem of one of our LSI controllers]]></summary></entry><entry><title type="html">How to Speed Test Your New Infiniband Card</title><link href="https://arpnetworks.com/blog/2016/11/07/how-to-speed-test-your-new-infiniband-card.html" rel="alternate" type="text/html" title="How to Speed Test Your New Infiniband Card" /><published>2016-11-07T19:21:09-08:00</published><updated>2016-11-07T19:21:09-08:00</updated><id>https://arpnetworks.com/blog/2016/11/07/how-to-speed-test-your-new-infiniband-card</id><content type="html" xml:base="https://arpnetworks.com/blog/2016/11/07/how-to-speed-test-your-new-infiniband-card.html"><![CDATA[<p>So, you grabbed a few Infiniband cards for cheap off eBay and are
wondering if they’re any good?</p>

<p>Here’s a quick way to throw some data through them and see.  You need
two cards and two Linux boxes.  In the examples below, I’m using Ubuntu
Linux and the interface name of the IB card is simply <code class="highlighter-rouge">ib0</code>.
<code class="highlighter-rouge">iperf</code> is already installed (<code class="highlighter-rouge">apt-get install iperf</code>).</p>

<p>On both boxes, we’ll use IPoIB (IP over Infiniband) to assign a couple
temporary IPs and <code class="highlighter-rouge">iperf</code> to run a performance test.  It’s important
to put the cards into <code class="highlighter-rouge">connected</code> mode and set a large MTU:</p>

<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nv">$ </span><span class="nb">sudo </span>modprobe ib_ipoib
<span class="nv">$ </span><span class="nb">sudo </span>sh <span class="nt">-c</span> <span class="s2">"echo connected &gt; /sys/class/net/ib0/mode"</span>
<span class="nv">$ </span><span class="nb">sudo </span>ifconfig ib0 10.0.0.1   <span class="c"># Use .2 for the other box</span>
<span class="nv">$ </span><span class="nb">sudo </span>ifconfig ib0 mtu 65520</code></pre></figure>

<p>On the first box, put <code class="highlighter-rouge">iperf</code> into server mode:</p>

<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nv">$ </span><span class="nb">sudo </span>iperf <span class="nt">-s</span> <span class="nt">-i</span> 1
<span class="nt">------------------------------------------------------------</span>
Server listening on TCP port 5001
TCP window size:  128 KByte <span class="o">(</span>default<span class="o">)</span>
<span class="nt">------------------------------------------------------------</span></code></pre></figure>

<p>On the second box, throw data at your first one (<code class="highlighter-rouge">-P 2</code> means to use 2
threads):</p>

<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nv">$ </span>iperf <span class="nt">-c</span> 10.0.0.1 <span class="nt">-P</span> 2
<span class="nt">------------------------------------------------------------</span>
Client connecting to 10.0.0.1, TCP port 5001
TCP window size: 1.20 MByte <span class="o">(</span>default<span class="o">)</span>
<span class="nt">------------------------------------------------------------</span>
<span class="o">[</span>  4] <span class="nb">local </span>10.0.0.2 port 46048 connected with 10.0.0.1 port 5001
<span class="o">[</span>  3] <span class="nb">local </span>10.0.0.2 port 46046 connected with 10.0.0.1 port 5001
<span class="o">[</span> ID] Interval       Transfer     Bandwidth
<span class="o">[</span>  4]  0.0-10.0 sec  14.6 GBytes  12.5 Gbits/sec
<span class="o">[</span>  3]  0.0-10.0 sec  14.6 GBytes  12.5 Gbits/sec
<span class="o">[</span>SUM]  0.0-10.0 sec  29.2 GBytes  25.0 Gbits/sec
<span class="err">$</span></code></pre></figure>

<p>So, there you have it.  The cards in the above example are pushing a healthy 25
Gbps.  It’ll be even faster if using pure Infiniband applications (rather than
IPoIB, since more processing is done in the Infiniband hardware, rather than
CPUs having to shuffle the TCP/IP stack, among other factors).</p>]]></content><author><name>Garry Dolley</name></author><category term="infiniband" /><summary type="html"><![CDATA[A quick and reliable way to put your new Infiniband card to the test]]></summary></entry><entry><title type="html">Ceph Is Always Scrubbing, Is That Normal?</title><link href="https://arpnetworks.com/blog/2016/10/26/ceph-is-always-scrubbing-is-that-normal.html" rel="alternate" type="text/html" title="Ceph Is Always Scrubbing, Is That Normal?" /><published>2016-10-26T23:21:08-07:00</published><updated>2016-10-26T23:21:08-07:00</updated><id>https://arpnetworks.com/blog/2016/10/26/ceph-is-always-scrubbing-is-that-normal</id><content type="html" xml:base="https://arpnetworks.com/blog/2016/10/26/ceph-is-always-scrubbing-is-that-normal.html"><![CDATA[<p>No, it’s probably not normal.</p>

<p>This was the case with our cluster.  We would always see stuff like the
following when we’d watch <code class="highlighter-rouge">ceph -w</code>:</p>

<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>2016-10-26 14:30:46.646110 osd.72 [INF] 5.3d7 scrub starts
2016-10-26 14:30:46.650324 osd.72 [INF] 5.3d7 scrub ok
2016-10-26 14:30:47.646236 osd.72 [INF] 5.3d7 scrub starts
2016-10-26 14:30:47.649672 osd.72 [INF] 5.3d7 scrub ok
2016-10-26 14:30:50.646450 osd.72 [INF] 5.3d7 scrub starts
2016-10-26 14:30:50.649940 osd.72 [INF] 5.3d7 scrub ok
2016-10-26 14:30:51.646326 osd.72 [INF] 5.3d7 scrub starts
2016-10-26 14:30:51.649113 osd.72 [INF] 5.3d7 scrub ok
</code></pre></div></div>

<p>In between all the normal <code class="highlighter-rouge">pgmap</code>, <code class="highlighter-rouge">pgs</code> and other statistics data.
And it would seem to be going on constantly, no matter what time of day
we check.</p>

<p>Turns out that the output above is a bit misleading, at least to me.  It
looks to me as if it actually scrubbed placement group <code class="highlighter-rouge">5.3d7</code>.  But,
in fact, it hadn’t.  That’s why we’d see it over and over again (and this
would happen to many, many PGs, not just that one).</p>

<p>So what is going on?</p>

<p>Turns out our <code class="highlighter-rouge">osd scrub load threshold</code> was too low.  It was the
default of <code class="highlighter-rouge">0.5</code>.  We run hosts with a pretty large number of OSDs, so
it’s quite normal for the load average to be above that even when things
are operating perfectly fine (and doesn’t seem to go below very much).</p>

<p>Therefore, we added the following to <code class="highlighter-rouge">ceph.conf</code>:</p>

<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[osd]
osd scrub load threshold = 2.0
</code></pre></div></div>

<p>And restarted our OSDs (alternatively, one can also <code class="highlighter-rouge">injectargs</code>).</p>

<p>This fixed the problem of the constant flood of scrub messages and scrubbing
worked normally again.</p>]]></content><author><name>Garry Dolley</name></author><category term="ceph" /><summary type="html"><![CDATA[No, it's probably not normal. This was the case with our cluster.]]></summary></entry></feed>