<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" >

  <title>Erik L. Arneson — Writer and Software Developer</title>
  <subtitle>Erik L. Arneson is a freelance writer and software developer with WordPress experience. He is located in Portland, Oregon.</subtitle>
  <generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator>
  <link href="https://arnesonium.com/feeds/web-development.xml" rel="self" type="application/atom+xml" />
  <link href="https://arnesonium.com/" rel="alternate" type="text/html" />
  <updated>2026-06-18T15:03:10+00:00</updated>
  <id>https://arnesonium.com/feeds/web-development.xml</id>
  <author>
    <name>Erik L. Arneson</name>
  </author>
      <entry>
        
        <title>How I Learned to Stop Worrying and Love Elementor</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2026/06/wordpress-love-elementor" rel="alternate" type="text/html" title="How I Learned to Stop Worrying and Love Elementor" />
        <updated>2026-06-18T00:00:00+00:00</updated>
        <id>https://arnesonium.com/2026/06/wordpress-love-elementor</id>
          <category term="php" />
        
          <category term="software-development" />
        
          <category term="web-development" />
        
          <category term="wordpress" />
        <content type="html" xml:base="https://arnesonium.com/2026/06/wordpress-love-elementor">&lt;p&gt;I have worked on a quite a few &lt;a href=&quot;/wordpress/&quot;&gt;WordPress projects&lt;/a&gt; lately that use &lt;a href=&quot;https://elementor.com/&quot;&gt;Elementor&lt;/a&gt;, which is a website
builder with a drag-and-drop interface and some other user-friendly bits. In the past, I have
typically avoided these kinds of tools for WordPress, because they caused more problems than they
solved, but recently, my mind has been changed.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;A few months ago, I helped start a new business, &lt;a href=&quot;https://middlechambermedia.com/&quot;&gt;Middle Chamber Media&lt;/a&gt;, which focuses on building websites
for Masonic lodges. My business partner brought me on because of my experience as a &lt;a href=&quot;/software-development/&quot;&gt;web developer&lt;/a&gt;
with &lt;a href=&quot;/wordpress/&quot;&gt;experience with WordPress&lt;/a&gt;. I have built a ton of custom themes in the past, frequently using
either a child theme approach or starting from a bare-bones theme and building from scratch. This
has worked quite well, and though it can produce a robust and speedy website, it can result in
maintenance challenges in the long-run.&lt;/p&gt;

&lt;p&gt;However, with Middle Chamber Media, we were suddenly faced with the process of managing and
deploying a large number of WordPress sites, and there are just a couple of us working on it.
Currently, our process involves my partner doing most of the theme development and website setup,
and then I go in and fine-tune the website for responsiveness (i.e. for phones and tablets). This
process has been working pretty well for us.&lt;/p&gt;

&lt;h2 id=&quot;more-elementor-experience&quot;&gt;More Elementor Experience&lt;/h2&gt;

&lt;p&gt;Earlier this year, I also helped another client with an Elementor-based WordPress website. This
client wanted some SEO help, but wanted to continue managing the website on their own. Since the
client is not a WordPress expert, Elementor presented an easy user interface for theme edits. We
worked together, using Elementor to clean things up for SEO purposes. And it worked!&lt;/p&gt;

&lt;p&gt;This processes have led me to a surprising conclusion: &lt;strong&gt;Elementor is great for certain things!&lt;/strong&gt; It has
been a very big time saver and an enabler of collaboration across different WordPress skill levels.
I had to adjust to the new workflow and learn the Elementor editor and paradigm, but it has been
worth it. It is such a huge leap forward compared to previous drag-and-drop theme builders for
WordPress. They all used to really suck!&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Process Automation for an Oregon Charitable Foundation</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2026/05/process-automation-oregon-charitable-foundation" rel="alternate" type="text/html" title="Process Automation for an Oregon Charitable Foundation" />
        <updated>2026-05-22T00:00:00+00:00</updated>
        <id>https://arnesonium.com/2026/05/sref</id>
          <category term="cloud" />
        
          <category term="cloud-computing" />
        
          <category term="golang" />
        
          <category term="svelte" />
        
          <category term="typescript" />
        
          <category term="automation" />
        
          <category term="case-study" />
        
          <category term="google-cloud" />
        
          <category term="programming" />
        
          <category term="testing" />
        
          <category term="web-development" />
        
          <category term="software-development" />
        <content type="html" xml:base="https://arnesonium.com/2026/05/process-automation-oregon-charitable-foundation">&lt;p&gt;The &lt;a href=&quot;https://orsrscholarships.com/&quot;&gt;Oregon Scottish Rite Education Foundation&lt;/a&gt; awards scholarships annually to students across Oregon
who are entering into college or trade schools. Over the past few years, their foundation has grown,
requiring them to distribute more scholarships than ever. However, since the foundation board is
small and composed entirely of volunteers, they were looking for some way to automate their application process to
reduce the number of manual steps required.&lt;/p&gt;

&lt;!--more--&gt;

&lt;h2 id=&quot;initial-approach&quot;&gt;Initial Approach&lt;/h2&gt;

&lt;p&gt;Members of the board approached me with a wish list of features and requirements. They wanted a
system to integrate seamlessly with their website, while incoming applications should be
automatically checked, sorted, and categorized by county. They already had a spreadsheet system for
tracking applicants as well as a cloud storage system for storing supporting documents; they wanted
the automation system to integrate with these existing components.&lt;/p&gt;

&lt;p&gt;Since the board was already utilizing Google Business products for cloud documents and storage, I
decided that the best approach would be to lean into Google Cloud services. Following their list of
requirements, I implemented a &lt;a href=&quot;https://cloud.google.com/run&quot;&gt;Google Cloud Run&lt;/a&gt; service in &lt;a href=&quot;https://go.dev/&quot;&gt;Go&lt;/a&gt; that processed incoming applications
from their website, then updated the spreadsheet while preparing their cloud storage system for each
application’s supporting documents. The spreadsheet now contained all the application data,
including a link to an automatically generated PDF version of the application and a link to the
cloud storage location.&lt;/p&gt;

&lt;p&gt;This initial approach cut out an enormous amount of manual work. Previously, applications were
submitted via the website and emailed to a board member, who then manually sorted them by county and
generated PDFs for storage and later distribution.&lt;/p&gt;

&lt;h2 id=&quot;implementation-challenges&quot;&gt;Implementation Challenges&lt;/h2&gt;

&lt;p&gt;The application submission window for the Oregon Scottish Rite Education Foundation runs from
December through March of each year, which gave us a limited amount of time to observe incoming live
data and how the automation was performing.&lt;/p&gt;

&lt;p&gt;My initial approach worked fairly well, and handled 94% of incoming applications properly. However,
the last 6% ran into various problems that prevented correct processing. One error arose from a
misspelling in a county name, which was caught early and corrected. Another series of errors arose
from processing errors with the Google Sheets API, which has both rate limiting and more mysterious,
inexplicable errors. I added additional error correction and error checking, but there was still
some additional manual work to enter data from a handful of applications.&lt;/p&gt;

&lt;p&gt;By the end of the application period, we had managed to reduce the amount of manual data entry and
processing by a large percentage, maybe as much as 60%. After discussing the current process
automation with the board, we began to see opportunities for further automation and improvement.&lt;/p&gt;

&lt;h2 id=&quot;additional-development&quot;&gt;Additional Development&lt;/h2&gt;

&lt;p&gt;After the first year’s application submission window, I began working with one of the board members
to plan out how the process could be improved even more. My list of improvements were primarily on
the backend, and involved robuster error detection and reporting, as well as a backup data store
that would allow the automation to recover from the Google Sheets API errors more elegantly.&lt;/p&gt;

&lt;p&gt;The board proposed an additional feature set that would further reduce manual data processing, by
allowing applicants to upload supporting documents such as letters of recommendation and high school
transcripts. These uploaded documents would then be processed and stored in the proper cloud storage
location, thus reducing the amount of manual file management required by volunteers.&lt;/p&gt;

&lt;p&gt;Implementing these two new features went very smoothly. It required the development of a new
frontend, using &lt;a href=&quot;https://www.typescriptlang.org/&quot;&gt;Typescript&lt;/a&gt; and &lt;a href=&quot;https://svelte.dev/&quot;&gt;Svelte&lt;/a&gt;. This frontend allowed applicants to upload their supporting
documents via a unique link given to each of them by automated email. It used both &lt;a href=&quot;https://cloud.google.com/storage&quot;&gt;Google Cloud
Storage&lt;/a&gt; and the Google Drive API to store these files.&lt;/p&gt;

&lt;p&gt;The improvements on the backend used &lt;a href=&quot;https://cloud.google.com/products/datastore&quot;&gt;Google Cloud Datastore&lt;/a&gt; and a more robust error recovery system.
It now backed up all incoming scholarship applications until they could reliably and more slowly be
added to the spreadsheet with the Google Sheets API, thus nearly eliminating all rate limiting
errors. In addition, progress reports and error output could now be viewed using a new frontend
administrative interface.&lt;/p&gt;

&lt;h2 id=&quot;results&quot;&gt;Results&lt;/h2&gt;

&lt;p&gt;This round of improvements produced significant results. Over the entire span of the second year of
application submissions, error rates dropped from 6% to &lt;em&gt;just one unrecoverable error.&lt;/em&gt; While I had
been hoping for improvement, even I was surprised by how much of an improvement we achieved!&lt;/p&gt;

&lt;p&gt;The board reported that the amount of manual processing was reduced by another 80-90%, with only a
few applicants resorting to email for sending in their supporting documents. While we have discussed
further improvements to the process automation for the next application submission window, the board
is satisfied with the improvements provided by the level of automation implemented so far.&lt;/p&gt;

&lt;h2 id=&quot;lessons&quot;&gt;Lessons&lt;/h2&gt;

&lt;p&gt;This project benefited a lot by reviewing requirements and expectations frequently with the client.
They were great at providing me with very clear goals from the beginning, and as we progressed and
it became clear where the most volunteer time was being spent, we were able to identify more tasks
for automation.&lt;/p&gt;

&lt;p&gt;On the development side of things, three things were clear. First, cloud services really make the
development and deployment of process automation tools like this a breeze. Costs can be kept low
while still providing robust infrastructure for hosting.&lt;/p&gt;

&lt;p&gt;Second, I learned once more the importance of unit tests. I wrote unit tests for most elements of
the automation software, which allowed me to catch breaking changes and test features very quickly.
&lt;a href=&quot;https://www.ibm.com/think/topics/test-driven-development&quot;&gt;Test-driven development&lt;/a&gt; can be a great way to run a project, and though I did not follow all of its
parameters strictly, that particular philosophy did guide my decision.&lt;/p&gt;

&lt;p&gt;Third, once more I was reminded of how the best-planned software runs into difficulties when it
collides with the real world. I failed to anticipate the Google Sheets API issues and did not
implement enough comprehensive error correction early on. That is not an error I shall repeat again!&lt;/p&gt;

&lt;p&gt;Finally, I learned that even with a project that seems as straightforward as this one, it is
important to control expectations early. This turned into a multiyear project because we saw room
for improvement. I think it is important for a business or organization looking for process
automation to understand that it can be an ongoing series of improvements; not everything will be
accomplished or perfected after one pass.&lt;/p&gt;

&lt;p&gt;Overall, I found this to be a rewarding project. I enjoyed working on software that was aiding a
good cause: helping high school graduates fund their education. It was also very nice to work for a
charitable foundation instead of a for-profit business; it made all of my programming feel a lot
better. I hope to work for more charitable foundations in the future.&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>New WordPress Services: Fast Fixes for Portland Businesses</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2025/11/new-wordpress-services" rel="alternate" type="text/html" title="New WordPress Services: Fast Fixes for Portland Businesses" />
        <updated>2025-11-05T00:00:00+00:00</updated>
        <id>https://arnesonium.com/2025/11/new-wordpress-services</id>
          <category term="wordpress" />
        
          <category term="portland" />
        
          <category term="web-development" />
        
          <category term="debugging" />
        <content type="html" xml:base="https://arnesonium.com/2025/11/new-wordpress-services">&lt;p&gt;Your WordPress site is either making you money or costing you opportunities. I’m opening up my calendar for quick-turn projects—and offering &lt;strong&gt;free site audits to new clients.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With 10+ years building WordPress sites,&lt;/strong&gt; I’ve seen the same problems tank small business budgets: slow load times, security vulnerabilities, broken plugins, and sites that just stop working.&lt;/p&gt;

&lt;!--more--&gt;

&lt;h2 id=&quot;what-im-offering&quot;&gt;What I’m Offering&lt;/h2&gt;

&lt;p&gt;See the full list on my &lt;a href=&quot;/wordpress/&quot;&gt;WordPress services page&lt;/a&gt;. Here is a quick rundown:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Quick-turnaround emergency WordPress rescue&lt;/li&gt;
  &lt;li&gt;Site speed optimization&lt;/li&gt;
  &lt;li&gt;Security hardening&lt;/li&gt;
  &lt;li&gt;Plugin customization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I am also available for &lt;strong&gt;monthly WordPress support retainers.&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;first-time-client-special&quot;&gt;First-Time Client Special&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Free 30-minute WordPress site audit (normally $75)&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;what-youll-get&quot;&gt;What you’ll get:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Speed analysis with specific fixes&lt;/li&gt;
  &lt;li&gt;Security vulnerability check&lt;/li&gt;
  &lt;li&gt;Plugin bloat assessment&lt;/li&gt;
  &lt;li&gt;Prioritized action plan&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;No obligation.&lt;/strong&gt; Just honest feedback on what’s holding your site back.&lt;/p&gt;

&lt;h2 id=&quot;between-the-lines&quot;&gt;Between the lines&lt;/h2&gt;

&lt;p&gt;I’m based in Portland, but work with businesses anywhere. Projects are priced for value and speed—not hourly rates that incentivize me to work slowly.&lt;/p&gt;

&lt;p&gt;The bottom line: &lt;strong&gt;If your WordPress site is slow, insecure, or broken, you’re losing money every day.&lt;/strong&gt; Let’s fix it this week, not next quarter.&lt;/p&gt;

&lt;h2 id=&quot;what-next&quot;&gt;What next?&lt;/h2&gt;

&lt;p&gt;Contact me on my &lt;a href=&quot;/wordpress/&quot;&gt;WordPress services page&lt;/a&gt;, or using the form below.&lt;/p&gt;

&lt;!-- modify this form HTML and place wherever you want your form --&gt;
&lt;form action=&quot;https://formspree.io/f/xjvzwrkp&quot; method=&quot;POST&quot;&gt;
  &lt;label&gt;
    Your email:
    &lt;input type=&quot;email&quot; name=&quot;email&quot; /&gt;
  &lt;/label&gt;
  &lt;br /&gt;
  &lt;label&gt;
    Your message:&lt;br /&gt;
    &lt;textarea name=&quot;message&quot; rows=&quot;20&quot; style=&quot;width:90%&quot;&gt;&lt;/textarea&gt;
  &lt;/label&gt;
  &lt;!-- your other form fields go here --&gt;
  &lt;div class=&quot;g-recaptcha&quot; data-sitekey=&quot;6LcDtPsSAAAAALF66lY2GqToLSZShqoxLMGsBMFf&quot;&gt;&lt;/div&gt;
  &lt;button type=&quot;submit&quot; class=&quot;btn&quot;&gt;Send&lt;/button&gt;
&lt;/form&gt;

&lt;p&gt;&lt;strong&gt;Questions?&lt;/strong&gt; Feel free to DM me on LinkedIn.&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Using Amazon S3 as a Nette Service</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2016/10/using-amazon-s3-as-a-nette-service/" rel="alternate" type="text/html" title="Using Amazon S3 as a Nette Service" />
        <updated>2016-10-26T22:17:16+00:00</updated>
        <id>https://arnesonium.com/2016/10/using-amazon-s3-as-a-nette-service</id>
          <category term="aws" />
        
          <category term="nette" />
        
          <category term="php" />
        
          <category term="programming" />
        
          <category term="s3" />
        
          <category term="web-development" />
        <content type="html" xml:base="https://arnesonium.com/2016/10/using-amazon-s3-as-a-nette-service/">&lt;p&gt;&lt;a href=&quot;https://nette.org/&quot;&gt;Nette&lt;/a&gt; is a popular web application framework for PHP. It is mostly pretty well documented and easy to use. Recently, I needed to upload media from a Nette application to &lt;a href=&quot;https://aws.amazon.com/s3/&quot;&gt;Amazon S3&lt;/a&gt;. This is how I created an S3 service for my Nette application. You will need to be familiar with Nette and have an existing Nette application to follow along.
&lt;!--more--&gt;&lt;/p&gt;

&lt;h1 id=&quot;installing-the-amazon-web-services-sdk&quot;&gt;Installing the Amazon Web Services SDK&lt;/h1&gt;

&lt;p&gt;Before anything will work, you will need to install the AWS SDK using Composer. Run the following command from your Nette project directory.&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;php composer.phar require aws/aws-sdk-php
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 id=&quot;the-s3uploader-service&quot;&gt;The S3Uploader Service&lt;/h1&gt;

&lt;p&gt;Next, create the file &lt;strong&gt;app/model/S3Uploader.php&lt;/strong&gt; and edit it to look like the following. You can also download my version &lt;a href=&quot;https://gist.github.com/pymander/a027523a7b9152660fac8e7bb4801c91&quot;&gt;from this link&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;language-php 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;cp&quot;&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;namespace&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;App\Model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Nette&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Aws\S3\S3Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;S3Uploader&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;cd&quot;&gt;/** @var \Aws\S3\S3Client */&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$s3client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;cd&quot;&gt;/** @var string */&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$bucket&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;__construct&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$bucket&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$accessKey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$secretKey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;putenv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;AWS_ACCESS_KEY_ID=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$accessKey&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;putenv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;AWS_SECRET_ACCESS_KEY=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$secretKey&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s3client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;\Aws\S3\S3Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;
            &lt;span class=&quot;s1&quot;&gt;&apos;version&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;latest&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;s1&quot;&gt;&apos;region&apos;&lt;/span&gt;  &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;us-west-2&apos;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;

        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bucket&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$bucket&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;cd&quot;&gt;/**
     * Upload a file to an S3 bucket
     *
     * @param string $key The key used for the uploaded object
     * @param string $file The filename to be uploaded
     * @param string $contentType The file&apos;s content type. This defaults to &quot;application/octet-stream&quot;
     *
     * @return string A URL to access the file publically.
     */&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;uploadPublic&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$contentType&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;application/octet-stream&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s3client&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;putObject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;
            &lt;span class=&quot;s1&quot;&gt;&apos;Bucket&apos;&lt;/span&gt;     &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bucket&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;s1&quot;&gt;&apos;Key&apos;&lt;/span&gt;        &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;s1&quot;&gt;&apos;SourceFile&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;s1&quot;&gt;&apos;ContentType&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$contentType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;s1&quot;&gt;&apos;ACL&apos;&lt;/span&gt;        &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;public-read&apos;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;

        &lt;span class=&quot;nv&quot;&gt;$url&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s3client&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getObjectUrl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bucket&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getClient&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s3client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getBucket&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bucket&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 id=&quot;configuring-the-configurator&quot;&gt;Configuring the Configurator&lt;/h1&gt;

&lt;p&gt;Finally, the tricky part. You need to configure the &lt;a href=&quot;https://doc.nette.org/en/2.4/configuring&quot;&gt;Nette Configurator&lt;/a&gt; so it knows about your new service. Follow these directions.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Open &lt;strong&gt;app/config/config.neon&lt;/strong&gt; with your favorite text editor. At the end of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;services:&lt;/code&gt; section, add the following line.&lt;/p&gt;

    &lt;div class=&quot;language-conf 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;n&quot;&gt;s3client&lt;/span&gt;: &lt;span class=&quot;n&quot;&gt;App&lt;/span&gt;\&lt;span class=&quot;n&quot;&gt;Model&lt;/span&gt;\&lt;span class=&quot;n&quot;&gt;S3Uploader&lt;/span&gt;(%&lt;span class=&quot;n&quot;&gt;s3client&lt;/span&gt;.&lt;span class=&quot;n&quot;&gt;bucket&lt;/span&gt;%, %&lt;span class=&quot;n&quot;&gt;s3client&lt;/span&gt;.&lt;span class=&quot;n&quot;&gt;access_key&lt;/span&gt;%, %&lt;span class=&quot;n&quot;&gt;s3client&lt;/span&gt;.&lt;span class=&quot;n&quot;&gt;secret_key&lt;/span&gt;%)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Open &lt;strong&gt;app/config/config.local.neon&lt;/strong&gt;. Find the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;parameters:&lt;/code&gt; section and add this block to it. Replace “ACCESS_KEY” with your AWS access key, and “SECRET_KEY” with your AWS secret key. Set “BUCKET_NAME” to the bucket you’ll be using for your uploads.&lt;/p&gt;

    &lt;div class=&quot;language-conf 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;n&quot;&gt;s3client&lt;/span&gt;:
   &lt;span class=&quot;n&quot;&gt;access_key&lt;/span&gt;: &lt;span class=&quot;n&quot;&gt;ACCESS_KEY&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;secret_key&lt;/span&gt;: &lt;span class=&quot;n&quot;&gt;SECRET_KEY&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;bucket&lt;/span&gt;: &lt;span class=&quot;n&quot;&gt;BUCKET_NAME&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h1 id=&quot;using-s3uploader&quot;&gt;Using S3Uploader&lt;/h1&gt;

&lt;p&gt;Open up the presenter file that will be using the S3Uploader service. You just need to add a few new lines.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Near the top of the file where you’re loading libraries, add this line.&lt;/p&gt;

    &lt;div class=&quot;language-php 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;kn&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;App\Model\S3Uploader&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;You will need to change your constructor definition to include S3Uploader. Assuming you haven’t changed your constructor function too much, it will probably look like the following.&lt;/p&gt;

    &lt;div class=&quot;language-php 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;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;__construct&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Nette&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;\Database\Context&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$database&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;S3Uploader&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$s3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Finally, you can call the S3Uploader with a simple method call.&lt;/p&gt;

    &lt;div class=&quot;language-php 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;nv&quot;&gt;$objectUrl&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$s3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;uploadPublic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$objectKey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$filePath&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$contentType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Good luck with S3Uploader. Please let me know in the comments how it is working for you. Note that this is an example and the finished product will probably be more sophisticated. However, this should get you started with using Amazon S3 in your Nette applications.&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Alternate Ways to Call wp-cron</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2016/03/alternate-ways-to-call-wp-cron/" rel="alternate" type="text/html" title="Alternate Ways to Call wp-cron" />
        <updated>2016-03-05T17:09:28+00:00</updated>
        <id>https://arnesonium.com/2016/03/alternate-ways-to-call-wp-cron</id>
          <category term="best-practices" />
        
          <category term="php" />
        
          <category term="programming" />
        
          <category term="web-development" />
        
          <category term="web-performance" />
        
          <category term="wordpress" />
        <content type="html" xml:base="https://arnesonium.com/2016/03/alternate-ways-to-call-wp-cron/">&lt;p&gt;WordPress includes a job scheduling system called wp-cron. The default method for scheduled jobs is for wp-cron to be checked on each page load, which has the potential to slow down your website while background jobs are run. Check out these other options that help maintain the user experience on your WordPress site while still running important tasks in the background.
&lt;!--more--&gt;&lt;/p&gt;

&lt;h2 id=&quot;using-alternate_wp_cron&quot;&gt;Using ALTERNATE_WP_CRON&lt;/h2&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ALTERNATE_WP_CRON&lt;/code&gt; method uses a quick, nearly invisible redirect to direct an incoming user to a new request while the old one continues running, executing background jobs. This is an easy, effective method and it works really well if you don’t have access to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;crontab&lt;/code&gt; on your hosting site. Even though this method adds some elements to the page URL, it’s only triggered when background jobs need to be run. To enable it, follow these instructions:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Open your site’s &lt;strong&gt;wp-config.php&lt;/strong&gt; in your text editor.&lt;/li&gt;
  &lt;li&gt;After the lines containing your database credentials, add the following lines:
    &lt;div class=&quot;language-php 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;cd&quot;&gt;/** Use alternate WP_CRON method with redirects. */&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;define&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;ALTERNATE_WP_CRON&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href=&quot;http://wordpress-hackers.1065353.n5.nabble.com/ALTERNATE-WP-CRON-Is-it-worth-it-td39843.html&quot; target=&quot;_blank&quot;&gt;Read more about the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ALTERNATE_WP_CRON&lt;/code&gt; method here.&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;using-crontab&quot;&gt;Using Crontab&lt;/h2&gt;

&lt;p&gt;If you have access to a shell on your web host and can run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cron&lt;/code&gt; jobs, this method might be the best. It ensures that background jobs will get run, even when your website isn’t getting any visitors. It also runs background jobs without requiring a redirect or any additional delays that will be noticed by users. Here’s how you do it.&lt;/p&gt;

&lt;h3 id=&quot;add-a-crontab-entry&quot;&gt;Add a Crontab Entry&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;Run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;crontab -e&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Add the following lines to the end of your crontab file:
    &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;# Call wp-cron regularly&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;/15 &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; curl http://www.example.com/wp-cron.php &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; /dev/null 2&amp;gt;&amp;amp;1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Make sure you replace “www.example.com” with your website’s hostname. The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*/15&lt;/code&gt; specifies that &lt;strong&gt;wp-cron.php&lt;/strong&gt; will be called every 15 minutes. If you would like to change this, replace the 15 with a different number.&lt;/p&gt;

&lt;h3 id=&quot;disable-built-in-wp-cron&quot;&gt;Disable Built-in wp-cron&lt;/h3&gt;

&lt;p&gt;The next step is to disable the built-in call to wp-cron in WordPress.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Open your site’s &lt;strong&gt;wp-config.php&lt;/strong&gt; in your text editor.&lt;/li&gt;
  &lt;li&gt;After the lines containing your database credentials, add the following lines:
    &lt;div class=&quot;language-php 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;cd&quot;&gt;/** Disable built-in cron in favor of system crontab */&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;define&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;DISABLE_WP_CRON&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For more details on this method, &lt;a href=&quot;https://easyengine.io/tutorials/wordpress/wp-cron-crontab/&quot; target=&quot;_blank&quot;&gt;check out this page on EasyEngine&lt;/a&gt;.&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Still Doing Well with SSL</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2016/01/still-doing-well-with-ssl/" rel="alternate" type="text/html" title="Still Doing Well with SSL" />
        <updated>2016-01-29T20:10:47+00:00</updated>
        <id>https://arnesonium.com/2016/01/still-doing-well-with-ssl</id>
          <category term="announcement" />
        
          <category term="cryptography" />
        
          <category term="testing" />
        
          <category term="web-development" />
        
          <category term="web-performance" />
        <content type="html" xml:base="https://arnesonium.com/2016/01/still-doing-well-with-ssl/">&lt;p&gt;I renewed my SSL certificate today and updated the configuration. Still doing pretty well!
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://arnesonium.com/wp-content/uploads/2016/01/Screenshot-from-2016-01-29-12-07-06.png&quot; alt=&quot;arnesonium.com SSL certificate test&quot; width=&quot;923&quot; height=&quot;516&quot; class=&quot;aligncenter size-full wp-image-576&quot; /&gt;&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>OpenPGP for WordPress Now Supports Contact Form 7</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2016/01/openpgp-for-wordpress-now-supports-contact-form-7/" rel="alternate" type="text/html" title="OpenPGP for WordPress Now Supports Contact Form 7" />
        <updated>2016-01-20T16:54:43+00:00</updated>
        <id>https://arnesonium.com/2016/01/openpgp-for-wordpress-now-supports-contact-form-7</id>
          <category term="announcement" />
        
          <category term="cryptography" />
        
          <category term="encryption" />
        
          <category term="javascript" />
        
          <category term="openpgp" />
        
          <category term="php" />
        
          <category term="plugin" />
        
          <category term="programming" />
        
          <category term="web-development" />
        
          <category term="wordpress" />
        <content type="html" xml:base="https://arnesonium.com/2016/01/openpgp-for-wordpress-now-supports-contact-form-7/">&lt;p&gt;&lt;a href=&quot;https://arnesonium.com/wordpress-openpgp/&quot;&gt;OpenPGP Form Encryption for WordPress&lt;/a&gt; now supports &lt;a href=&quot;http://contactform7.com/&quot; target=&quot;_blank&quot;&gt;Contact Form 7&lt;/a&gt;. You can download version 1.4.0 at the &lt;a href=&quot;https://wordpress.org/plugins/openpgp-form-encryption/&quot; target=&quot;_blank&quot;&gt;WordPress plugin site&lt;/a&gt; and start using a safer contact form on your website today!&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Pono Rez WordPress Plugin</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2016/01/pono-rez-wordpress-plugin/" rel="alternate" type="text/html" title="Pono Rez WordPress Plugin" />
        <updated>2016-01-18T17:52:32+00:00</updated>
        <id>https://arnesonium.com/2016/01/pono-rez-wordpress-plugin</id>
          <category term="javascript" />
        
          <category term="php" />
        
          <category term="programming" />
        
          <category term="web-development" />
        
          <category term="wordpress" />
        <content type="html" xml:base="https://arnesonium.com/2016/01/pono-rez-wordpress-plugin/">&lt;p&gt;Together with &lt;a href=&quot;http://www.commercecollective.com/&quot; target=&quot;_blank&quot;&gt;Commerce Collective&lt;/a&gt;, ((I started working with them last year, &lt;a href=&quot;https://arnesonium.com/2015/05/now-working-with-commercecollective/&quot;&gt;remember&lt;/a&gt;?)) we have built a WordPress plugin to allow &lt;a href=&quot;http://www.a3h.org/&quot; target=&quot;_blank&quot;&gt;Activities &amp;amp; Attractions Association of Hawaii&lt;/a&gt; (A3H) to quickly and easily integrate activity bookings and sales into their WordPress websites.
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;We still have more features to add to the plugin, but it’s a solid start that will save A3H members a lot of time. It is written in PHP ((Like all WordPress plugins, of course.)) and JavaScript, and uses the Pono Rez SOAP interface to integrate activity data into a WordPress page.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://wordpress.org/plugins/a3h-pono-rez-activities-and-booking/&quot; target=&quot;_blank&quot;&gt;Check out the plugin page here!&lt;/a&gt;&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>CenturyLink AppFog Tutorial</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2016/01/centurylink-appfog-tutorial/" rel="alternate" type="text/html" title="CenturyLink AppFog Tutorial" />
        <updated>2016-01-15T17:26:41+00:00</updated>
        <id>https://arnesonium.com/2016/01/centurylink-appfog-tutorial</id>
          <category term="appfog" />
        
          <category term="centurylink-cloud" />
        
          <category term="cloud-computing" />
        
          <category term="cloudfoundry" />
        
          <category term="javascript" />
        
          <category term="node-js" />
        
          <category term="programming" />
        
          <category term="web-development" />
        
          <category term="writing" />
        <content type="html" xml:base="https://arnesonium.com/2016/01/centurylink-appfog-tutorial/">&lt;p&gt;Recently I wrote a tutorial with &lt;a href=&quot;http://wordlions.com/&quot; target=&quot;_blank&quot;&gt;Word Lions&lt;/a&gt; for &lt;a href=&quot;http://ctl.io/&quot; target=&quot;_blank&quot;&gt;CenturyLink Cloud&lt;/a&gt; that teaches how to build and deploy a Node.js application to CenturyLink AppFog. The tutorial and application were really fun to build and write. It was my first Node.js project, and my first experience with CloudFoundry. The tutorial uses the following CenturyLink Cloud products:
&lt;!--more--&gt;&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;https://www.ctl.io/appfog/&quot;&gt;AppFog&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;https://www.ctl.io/orchestrate/&quot;&gt;Orchestrate&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;https://www.ctl.io/object-storage/&quot;&gt;Object Storage&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AppFog is CenturyLink Cloud’s CloudFoundry system. It is really powerful, and it appears to be more flexible than &lt;a href=&quot;https://arnesonium.com/tag/google-cloud/&quot;&gt;Google App Engine&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Read the Tutorial&lt;/h2&gt;

&lt;p&gt;The tutorial walks you through building a document storage system with a built-in PDF reader and comment storage. It also includes user authentication and some other neat Node.js tricks. You can follow the tutorial from the following links, which will include all of the information needed to get you up and running on AppFog with Node.js. Enjoy!&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;&lt;a href=&quot;https://www.ctl.io/developers/blog/post/deploy-app-user-login&quot;&gt;Deploy an App With User Login&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;https://www.ctl.io/developers/blog/post/appfog-object-storage&quot;&gt;Using CenturyLink Cloud for Object Storage&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;https://www.ctl.io/developers/blog/post/search-document-metadata&quot;&gt;Add Search Capabilities with Orchestrate&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;https://www.ctl.io/developers/blog/post/document-review-comment&quot;&gt;Building a PDF Viewer and Comment System&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</content>
      </entry>
    
      <entry>
        
        <title>Send Secure Email with Entrypt.to Service</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2015/06/send-secure-email-with-entrypt-to-service/" rel="alternate" type="text/html" title="Send Secure Email with Entrypt.to Service" />
        <updated>2015-06-08T15:48:03+00:00</updated>
        <id>https://arnesonium.com/2015/06/send-secure-email-with-entrypt-to-service</id>
          <category term="cryptography" />
        
          <category term="email" />
        
          <category term="openpgp" />
        
          <category term="programming" />
        
          <category term="web-development" />
        <content type="html" xml:base="https://arnesonium.com/2015/06/send-secure-email-with-entrypt-to-service/">&lt;p&gt;While my &lt;a href=&quot;/wordpress-openpgp/&quot;&gt;OpenPGP plugin for WordPress&lt;/a&gt; might be very helpful, the &lt;a href=&quot;https://encrypt.to/&quot; target=&quot;_blank&quot;&gt;Encrypt.to service&lt;/a&gt; allows you to quickly send encrypted email with just one click. It looks powerful.
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;You can &lt;a href=&quot;https://encrypt.to/earneson@arnesonium.com&quot; target=&quot;_blank&quot;&gt;click here to send me encrypted email&lt;/a&gt; or visit the &lt;a href=&quot;https://github.com/encrypt-to/encrypt.to&quot; target=&quot;_blank&quot;&gt;source code&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://encrypt.to/earneson@arnesonium.com&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://arnesonium.com/wp-content/uploads/2015/05/Screenshot-from-2015-05-29-125540.png&quot; alt=&quot;Screenshot from 2015-05-29 12:55:40&quot; width=&quot;489&quot; height=&quot;545&quot; class=&quot;aligncenter size-full wp-image-441&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Now Working with CommerceCollective!</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2015/05/now-working-with-commercecollective/" rel="alternate" type="text/html" title="Now Working with CommerceCollective!" />
        <updated>2015-05-26T15:02:27+00:00</updated>
        <id>https://arnesonium.com/2015/05/now-working-with-commercecollective</id>
          <category term="announcement" />
        
          <category term="commercecollective" />
        
          <category term="portland" />
        
          <category term="web-design" />
        
          <category term="web-development" />
        
          <category term="writing" />
        <content type="html" xml:base="https://arnesonium.com/2015/05/now-working-with-commercecollective/">&lt;p&gt;I am now working with my good friends at &lt;a href=&quot;http://www.commercecollective.com/&quot; target=&quot;_blank&quot;&gt;CommerceCollective&lt;/a&gt;! CommerceCollective is a web presence management company located here in Portland, Oregon, and they are great at SEO and social media stuff. They also are really talented web designers. If you’re looking for a full website solution, from design down to the nuts and bolts, we are the place to go.&lt;/p&gt;

&lt;p&gt;I’ll be supplementing their services with full-stack web development, IT consulting, and a little bit of copy writing. &lt;a href=&quot;http://www.commercecollective.com/who-we-are/&quot; target=&quot;_blank&quot;&gt;Read more about our team here!&lt;/a&gt;&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Good, solid SSL</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2015/05/good-solid-ssl/" rel="alternate" type="text/html" title="Good, solid SSL" />
        <updated>2015-05-24T02:12:06+00:00</updated>
        <id>https://arnesonium.com/2015/05/good-solid-ssl</id>
          <category term="announcement" />
        
          <category term="cryptography" />
        
          <category term="testing" />
        
          <category term="web-development" />
        
          <category term="web-performance" />
        <content type="html" xml:base="https://arnesonium.com/2015/05/good-solid-ssl/">&lt;p&gt;I’m in the middle of some major migrations and upgrades on the Arnesonium servers. So far, the results have been positive. For instance, the SSL/TLS configuration on my webserver is finally awesome. I’ve also got &lt;a href=&quot;https://www.maxcdn.com/&quot; target=&quot;_blank&quot;&gt;MaxCDN&lt;/a&gt; configured properly, so the entire website is now served via SSL/TLS only!
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;Here’s what the &lt;a href=&quot;https://www.ssllabs.com/ssltest&quot; target=&quot;_blank&quot;&gt;Qualys SSL Labs&lt;/a&gt; checker had to say:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://arnesonium.com/wp-content/uploads/2015/05/Screenshot-from-2015-05-23-190227.png&quot; alt=&quot;Screenshot from 2015-05-23 19:02:27&quot; width=&quot;934&quot; height=&quot;384&quot; class=&quot;aligncenter size-full wp-image-418&quot; /&gt;&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Should WordPress Encrypt All Email?</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2015/04/should-wordpress-encrypt-all-email/" rel="alternate" type="text/html" title="Should WordPress Encrypt All Email?" />
        <updated>2015-04-13T15:13:43+00:00</updated>
        <id>https://arnesonium.com/2015/04/should-wordpress-encrypt-all-email</id>
          <category term="cryptography" />
        
          <category term="openpgp" />
        
          <category term="web-development" />
        
          <category term="wordpress" />
        <content type="html" xml:base="https://arnesonium.com/2015/04/should-wordpress-encrypt-all-email/">&lt;p&gt;WordPress sends out email sometimes, and it doesn’t encrypt any of them by default. &lt;a href=&quot;http://buli.waw.pl/wordpress-openpgp-emails/&quot; title=&quot;Integration of WordPress and OpenPGP for a better security&quot; target=&quot;_blank&quot;&gt;&lt;em&gt;Integration of WordPress and OpenPGP for a better security&lt;/em&gt;&lt;/a&gt; is a case study by Paweł Bulwan that examines the security implications of all of these emails. Are they leaking important information? Should WordPress site owners worry about them?
&lt;!--more--&gt;&lt;/p&gt;

&lt;h2&gt;Only Limited Security Threats&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;http://arnesonium.com/wp-content/uploads/2014/12/640px-Enigma-plugboard-300x204.jpg#right&quot; alt=&quot;Enigma Plugboard&quot; width=&quot;300&quot; height=&quot;204&quot; class=&quot;alignright size-medium wp-image-122&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Mr. Bulwan only found five potential security threats, which is pretty good news. None of them are show-stoppers. However, I believe he missed something important, which is that any information that is leaked about login credentials can cause issues. Leaked information can be used to limit an attacker’s problem space, reducing the complexity of an attack.&lt;/p&gt;

&lt;p&gt;Mr. Bulwan’s idea of providing OpenPGP encryption for any emails that WordPress sends is a great one. In fact, if WordPress provided an OpenPGP API, it would spell the obsolescence of my &lt;a href=&quot;http://arnesonium.com/wordpress-openpgp/&quot; title=&quot;OpenPGP Form Encryption for WordPress&quot;&gt;OpenPGP Form Encryption for WordPress plugin&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That would be really cool.&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Please Use Version Control</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2015/04/please-use-version-control/" rel="alternate" type="text/html" title="Please Use Version Control" />
        <updated>2015-04-09T03:07:44+00:00</updated>
        <id>https://arnesonium.com/2015/04/please-use-version-control</id>
          <category term="git" />
        
          <category term="github" />
        
          <category term="programming" />
        
          <category term="stack-overflow" />
        
          <category term="version-control" />
        
          <category term="web-development" />
        <content type="html" xml:base="https://arnesonium.com/2015/04/please-use-version-control/">&lt;p&gt;Stack Overflow released their &lt;a href=&quot;http://stackoverflow.com/research/developer-survey-2015&quot; title=&quot;Stack Overflow Developer Survey 2015&quot; target=&quot;_blank&quot;&gt;2015 Developer Survey&lt;/a&gt; this week, and it has some interesting results. There are plenty of articles being written about their findings, so I’m only going to focus on one of them: version control.
&lt;!--more--&gt;&lt;/p&gt;

&lt;h2&gt;9.3% of Respondents Don&apos;t Use Version Control&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;http://arnesonium.com/wp-content/uploads/2015/04/Screenshot-from-2015-04-08-192457.png&quot; alt=&quot;Almost 10% of programmers aren&apos;t using version control.&quot; width=&quot;300&quot; height=&quot;188&quot; class=&quot;size-medium wp-image-345&quot; /&gt;&lt;/p&gt;

&lt;p&gt;StackOverflow says that &lt;a href=&quot;http://stackoverflow.com/research/developer-survey-2015#tech-sourcecontrol&quot; title=&quot;Stack Overflow Developer Survey 2015&quot; target=&quot;_blank&quot;&gt;almost 10% of developers still aren’t using version control&lt;/a&gt;. This is terrible. If you happen to be one of the developers who hasn’t adopted version control yet, &lt;b&gt;make it your next priority!&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Version control, also known as source control or revision control, is vital to best programming practices. It provides an incremental backup along with comments and notes on changes that have been made. It provides a view of changes and all kinds of handy features, such as handling conflicts between changes, release tagging, code branches, and more. If you aren’t sure what version control is, check out Ilya Olevsky’s post, &lt;a href=&quot;http://www.codeservedcold.com/version-control-importance/&quot; title=&quot;Why Version Control is Critical to Your Success&quot; target=&quot;_blank&quot;&gt;“Why Version Control is Critical to Your Success,”&lt;/a&gt; and then come back here.&lt;/p&gt;

&lt;h2&gt;Essential to Collaboration and Continuity&lt;/h2&gt;

&lt;p&gt;If you are looking to hire a freelance developer, make sure you hire one that uses version control. It is essential to maintaining a healthy history of code releases, project updates, and bug fixes. What if you only need to use your freelancer every once in a while? What if you decide to add more developers, or change developers all together? Without version control, this becomes a nightmare.&lt;/p&gt;

&lt;p&gt;A client recently brought me a project that had been built by another developer a couple of years ago. They wanted to move their web application from one host to another. However, there was a lot that needed to be cleaned up before the move could happen, including some outdated PHP code and odd database settings. In the project’s main directory, there was a mess of old, unused source code files. Just the &lt;code&gt;index.php&lt;/code&gt; file had multiple versions:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;index2.php&lt;/li&gt;
	&lt;li&gt;index3.php&lt;/li&gt;
	&lt;li&gt;indexold.php&lt;/li&gt;
	&lt;li&gt;index.php_old&lt;/li&gt;
	&lt;li&gt;index.php_bak&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In all, there were 598 unused files that were unnecessary backups of old, broken code. This type of mess is easily avoided with version control. Please stay sane, keep your customers happy, and your source code easy to navigate. Use version control.&lt;/p&gt;

&lt;h2&gt;Getting Started with Version Control&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;http://arnesonium.com/wp-content/uploads/2015/04/git-logo.png&quot; alt=&quot;git-logo&quot; width=&quot;220&quot; height=&quot;92&quot; class=&quot;alignright size-full wp-image-347&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If you’ve decided to make the right move and start using version control, you will see that there are many to choose from. However, if you’re just going to learn one, you should start with &lt;b&gt;Git&lt;/b&gt;. As you can see from the survey, it is the most widely used. The best place to start is probably in the free e-book offered by the Git development team. &lt;a href=&quot;http://git-scm.com/book/en/v1/Getting-Started&quot; title=&quot;Git: Getting Started&quot; target=&quot;_blank&quot;&gt;Click here to get started.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;If You&apos;re Doing It, Thank You&lt;/h2&gt;

&lt;p&gt;The first time I encountered a team that wasn’t using version control, I was shocked. The second time, I sighed in exasperation. Now, I am thankful that over 90% of developers are using it, and I look forward to the day that every project I join comes with a &lt;code&gt;git log&lt;/code&gt; command. If you are using version control, I hope you spread the word and make sure that your fellow programmers are doing it, too. Save the rest of us some pain!&lt;/p&gt;

&lt;p&gt;As a bonus, here’s my favorite &lt;code&gt;git log&lt;/code&gt; command. Add it to your aliases.&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 log &lt;span class=&quot;nt&quot;&gt;--oneline&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--graph&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--all&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--decorate&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;small&gt;&lt;em&gt;The featured image for this post is a pile of logs, to remind you that logs are important, and a vital part of version control.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Create a Document From Twitter with TweetBook</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2015/04/create-a-document-from-twitter-with-tweetbook/" rel="alternate" type="text/html" title="Create a Document From Twitter with TweetBook" />
        <updated>2015-04-01T17:48:56+00:00</updated>
        <id>https://arnesonium.com/2015/04/create-a-document-from-twitter-with-tweetbook</id>
          <category term="golang" />
        
          <category term="google-cloud" />
        
          <category term="programming" />
        
          <category term="publishing" />
        
          <category term="tweetbook" />
        
          <category term="twitter" />
        
          <category term="web-development" />
        <content type="html" xml:base="https://arnesonium.com/2015/04/create-a-document-from-twitter-with-tweetbook/">&lt;p&gt;I just released &lt;a href=&quot;http://tweetbook.arnesonium.com/&quot; title=&quot;TweetBook&quot; target=&quot;_blank&quot;&gt;TweetBook&lt;/a&gt;, a web application to transform a Twitter stream into a simple document that can easily be turned into a photo album.
&lt;!--more--&gt;&lt;/p&gt;

&lt;h2&gt;The Problem&lt;/h2&gt;
&lt;p&gt;A client came to me complaining that there was no available solution to export a Twitter feed as a document filled with images. There are various other Twitter-to-document converters out there, but they all focus on the text. The client asked me to build a tool to fill this void.&lt;/p&gt;

&lt;h2&gt;The Solution&lt;/h2&gt;
&lt;p&gt;Since I’ve been working with Google App Engine a lot lately, I used Go to write a tool that retrieves Tweets from a search or timeline. It provides a number of formatting options, and then creates a simple document suitable for exporting into an HTML or PDF file.&lt;/p&gt;

&lt;h2&gt;Try It Out!&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;As of 2022, this application is seven years old and probably doesn’t work anymore.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The client told me to do whatever I wanted with the code, so I’m making it available for use! &lt;strong&gt;&lt;a href=&quot;http://tweetbook.arnesonium.com/&quot; title=&quot;TweetBook&quot; target=&quot;_blank&quot;&gt;Click here to try TweetBook!&lt;/a&gt;&lt;/strong&gt; If you find it useful, please consider funding further development by contributing a small amount with this button:&lt;/p&gt;

&lt;form action=&quot;https://www.paypal.com/cgi-bin/webscr&quot; method=&quot;post&quot; target=&quot;_top&quot;&gt;
 &lt;button type=&quot;submit&quot; class=&quot;btn&quot;&gt;Contribute $1.99 &amp;raquo;&lt;/button&gt;&lt;input type=&quot;hidden&quot; name=&quot;cmd&quot; value=&quot;_s-xclick&quot; /&gt;&lt;input type=&quot;hidden&quot; name=&quot;hosted_button_id&quot; value=&quot;3PNSJJHRF9XWA&quot; /&gt;
 &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;https://www.paypalobjects.com/en_US/i/scr/pixel.gif&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;
&lt;/form&gt;

&lt;h2&gt;Do You Have a Suggestion? A Bug Report?&lt;/h2&gt;
&lt;p&gt;If you have additional ideas for TweetBook, please visit my &lt;a href=&quot;http://arnesonium.com/contact/&quot; title=&quot;Contact&quot;&gt;Contact page&lt;/a&gt;. I’m eager to hear your feedback and get suggestions and bug reports!&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Don&apos;t Modify the Clipboard with JavaScript</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2015/03/dont-modify-the-clipboard-with-javascript/" rel="alternate" type="text/html" title="Don't Modify the Clipboard with JavaScript" />
        <updated>2015-03-02T16:42:53+00:00</updated>
        <id>https://arnesonium.com/2015/03/dont-modify-the-clipboard-with-javascript</id>
          <category term="best-practices" />
        
          <category term="javascript" />
        
          <category term="programming" />
        
          <category term="web-design" />
        
          <category term="web-development" />
        <content type="html" xml:base="https://arnesonium.com/2015/03/dont-modify-the-clipboard-with-javascript/">&lt;p&gt;Recently, I was reading an article about a newly published book that I’m interested in. However, the article didn’t include a link to the book, so I copied the title by highlighting it with the mouse and hitting ‘Ctrl-C’, and opened a new browser tab to do a search. However, upon pasting, I saw the book title along with an annoying addition: “To read more, visit our website at [redacted].”&lt;/p&gt;

&lt;p&gt;This sort of website behavior is not okay.
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://arnesonium.com/wp-content/uploads/2015/02/3429454121_9a93f53855_o-300x200.jpg#right&quot; alt=&quot;3429454121_9a93f53855_o&quot; width=&quot;300&quot; height=&quot;200&quot; class=&quot;alignright size-medium wp-image-309&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I’ve seen the behavior on a number of websites, and it is among my least favorite trends in web development. The user is probably using his clipboard for one of two reasons. First, the website has a UX problem, and it has neglected to link to something important. Second, the user needs the text either for a quote, or to look up an unrelated term. For instance, this sentence has the word “bucolic” in it, and that’s an uncommon word that you might want to look up.&lt;/p&gt;

&lt;p&gt;But you can’t easily, because I’ve included JavaScript on this page that modifies your copy buffer. Do you see how annoying that is? Please don’t go mucking about in your users’ copy buffers.&lt;/p&gt;

&lt;p&gt;If you want to see what happens when you try to copy and paste on this page, highlight some text on the page and hit ‘Ctrl-C’ (or ‘Cmd-C’ for OS X users). Then go to the handy text area below and paste with ‘Ctrl-V’.&lt;/p&gt;

&lt;textarea style=&quot;width:100%&quot;&gt;&lt;/textarea&gt;

&lt;p&gt;That’s really obnoxious, isn’t it?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post was updated in 2022 to use Jekyll to load custom JavaScript instead of a custom WordPress plugin.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;em&gt;The image for this post comes from &lt;a href=&quot;https://www.flickr.com/photos/shimelle/&quot; target=&quot;_blank&quot;&gt;Flickr user Shimelle Laine&lt;/a&gt;.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Pansophie Online Color Test</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2015/02/pansophie-online-color-test/" rel="alternate" type="text/html" title="Pansophie Online Color Test" />
        <updated>2015-02-23T16:46:52+00:00</updated>
        <id>https://arnesonium.com/2015/02/pansophie-online-color-test</id>
          <category term="javascript" />
        
          <category term="jquery" />
        
          <category term="php" />
        
          <category term="programming" />
        
          <category term="web-design" />
        
          <category term="web-development" />
        
          <category term="zend-framework" />
        <content type="html" xml:base="https://arnesonium.com/2015/02/pansophie-online-color-test/">&lt;p&gt;&lt;a href=&quot;http://eyesandedge.com/pansophie/&quot; target=&quot;_blank&quot;&gt;Pansophie Personality and Color&lt;/a&gt; is focused on mapping personalities to colors. Alexandra Hall wanted an online testing platform with flexible questions, testing mechanisms, and report generation. I built a full-featured web application to meet Pansophie PC’s requirements. This was one of my early Zend Framework projects, but it ended up with some neat features.
&lt;!--more--&gt;&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;A private administrative interface&lt;/li&gt;
	&lt;li&gt;Seamless jQuery-backed test interface with few pageloads&lt;/li&gt;
	&lt;li&gt;Custom PDF reports, generated on the fly&lt;/li&gt;
	&lt;li&gt;A customer database with contact information&lt;/li&gt;
	&lt;li&gt;API endpoints for test generation&lt;/li&gt;
	&lt;li&gt;Integration with 3rd party e-commerce system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pansopie PC isn’t currently doing business.&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Prime Number Service on Google App Engine</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2015/02/prime-number-google-app-engine/" rel="alternate" type="text/html" title="Prime Number Service on Google App Engine" />
        <updated>2015-02-20T22:37:41+00:00</updated>
        <id>https://arnesonium.com/2015/02/prime-number-google-app-engine</id>
          <category term="cloud" />
        
          <category term="github" />
        
          <category term="golang" />
        
          <category term="google-cloud" />
        
          <category term="php" />
        
          <category term="plugin" />
        
          <category term="prime-numbers" />
        
          <category term="programming" />
        
          <category term="web-development" />
        
          <category term="wordpress" />
        <content type="html" xml:base="https://arnesonium.com/2015/02/prime-number-google-app-engine/">&lt;p&gt;As I &lt;a href=&quot;http://arnesonium.com/2015/02/random-link-rodeo/&quot; title=&quot;Random Link Rodeo&quot;&gt;mentioned earlier this week&lt;/a&gt;, I’ve decided to learn the &lt;a href=&quot;http://golang.org/&quot; target=&quot;_blank&quot;&gt;Go programming language&lt;/a&gt;. I’ve also been very interested in Google App Engine, which lets you deploy applications to the cloud from a development sandbox. It’s like magic for web and mobile applications!
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;Since I’m so fond of prime numbers, I thought I’d build a web service for calculating them. It does some other fun stuff, too, like figuring out if a number is happy. It also caches primes in the Google Cloud Datastore with some minimal statistics. If you’d like to see the source code for the prime number service, it’s &lt;a href=&quot;https://github.com/pymander/prime-json-service&quot; target=&quot;_blank&quot;&gt;available on GitHub&lt;/a&gt;.
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;The next thing I did was write the simplest of all WordPress plugins to query the service and return the latest prime number in the sequence. This all happens in a post using the [[nextprime]] shortcode. ((Including this information has the side-effect of revealing how much traffic this page gets.))&lt;/p&gt;

&lt;h1&gt;[nextprime]&lt;/h1&gt;

&lt;p&gt;You can also &lt;a href=&quot;http://sigma-crow-364.appspot.com/&quot; title=&quot;Prime Number Web App&quot; target=&quot;_blank&quot;&gt;visit the app itself&lt;/a&gt; and read about querying the service to get prime numbers for your own web page!&lt;/p&gt;

&lt;p&gt;Learning Go and writing for the Google App Engine has been really fun. I’m ready for a new challenge! If you have a web application in mind, &lt;a href=&quot;http://arnesonium.com/contact/&quot; title=&quot;Contact&quot;&gt;contact me and let’s figure out how to build it&lt;/a&gt;!&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Random Link Rodeo</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2015/02/random-link-rodeo/" rel="alternate" type="text/html" title="Random Link Rodeo" />
        <updated>2015-02-17T16:43:32+00:00</updated>
        <id>https://arnesonium.com/2015/02/random-link-rodeo</id>
          <category term="golang" />
        
          <category term="pdx" />
        
          <category term="portland" />
        
          <category term="web-development" />
        
          <category term="wordpress" />
        <content type="html" xml:base="https://arnesonium.com/2015/02/random-link-rodeo/">&lt;p&gt;I’ve been working on a few projects, but nothing I can share publicly. However, I’ve also been out in the world of the Portland tech community, which has been excellent. If you haven’t heard of &lt;a href=&quot;http://calagator.org/&quot; target=&quot;_blank&quot;&gt;Calagator&lt;/a&gt; yet, go check it out.
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;Last week, I went to a meet-and-greet for developer evangelists from &lt;a href=&quot;https://cloud.google.com/&quot; target=&quot;_blank&quot;&gt;Google Cloud Platform&lt;/a&gt;. After talking to one of the Google devs, I was convinced to give &lt;a href=&quot;http://golang.org/&quot; title=&quot;The Go Language&quot; target=&quot;_blank&quot;&gt;Go&lt;/a&gt; a try. He told me that Go has type inference, and while I was dismayed to learn that it only has type inference on variable declarations, it still looks like a good language. I’m playing around with &lt;a href=&quot;http://sawsij.com/&quot; target=&quot;_blank&quot;&gt;sawsij&lt;/a&gt; and &lt;a href=&quot;https://cloud.google.com/appengine/&quot; target=&quot;_blank&quot;&gt;Google App Engine&lt;/a&gt; and should have something to share in a few weeks.&lt;/p&gt;

&lt;p&gt;Last night, I went to a &lt;a href=&quot;http://pdxwp.com/&quot; target=&quot;_blank&quot;&gt;PDX WordPress Meetup&lt;/a&gt;, where I saw Kronda Adair of &lt;a href=&quot;http://karveldigital.com/&quot; title=&quot;Karvel Digital&quot; target=&quot;_blank&quot;&gt;Karvel Digital&lt;/a&gt; give a presentation called “5 Common Website Owner Mistakes and How to Fix Them.” After the talk, there was some interesting talk about website optimization and the “noisy neighbor” problem in cloud computing.&lt;/p&gt;

&lt;p&gt;Next week, I’m looking forward to the &lt;a href=&quot;http://calagator.org/events/1250467737&quot; target=&quot;_blank&quot;&gt;PdxDevOps meeting&lt;/a&gt;, mostly because I’ve realized that this is what I do most of the time. When I build websites, I tend to handle everything from hosting and system administration through software development.&lt;/p&gt;

&lt;p&gt;I’m really impressed by how full and rich the Portland tech community is. So far I’ve met a lot of great people in it, and I look forward to meeting more.&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>How to Enable XPath in Internet Explorer</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2015/02/how-to-enable-xpath-in-internet-explorer/" rel="alternate" type="text/html" title="How to Enable XPath in Internet Explorer" />
        <updated>2015-02-12T17:13:32+00:00</updated>
        <id>https://arnesonium.com/2015/02/how-to-enable-xpath-in-internet-explorer</id>
          <category term="epub" />
        
          <category term="internet-explorer" />
        
          <category term="javascript" />
        
          <category term="programming" />
        
          <category term="publishing" />
        
          <category term="web-development" />
        
          <category term="windows" />
        <content type="html" xml:base="https://arnesonium.com/2015/02/how-to-enable-xpath-in-internet-explorer/">&lt;p&gt;Yesterday, I shared a little bit about using a virtual machine to &lt;a href=&quot;http://arnesonium.com/2015/02/test-internet-explorer-without-booting-windows/&quot; title=&quot;How to Test Your Frontend Against Internet Explorer Without Booting Windows&quot;&gt;test frontend code under Internet Explorer (IE)&lt;/a&gt;. My goal was to use &lt;a href=&quot;https://code.google.com/p/wicked-good-xpath/&quot; title=&quot;Wicked Good XPath&quot; target=&quot;_blank&quot;&gt;Wicked Good XPath&lt;/a&gt; to add the proper XPath features to IE so that EPUB.js would work correctly, thus making the &lt;a href=&quot;http://arnesonium.com/2015/01/philalethes-e-bulletin-online-reader/&quot; title=&quot;Philalethes E-Bulletin Online Reader&quot;&gt;&lt;em&gt;Philalethes E-Bulletin&lt;/em&gt; Online Reader&lt;/a&gt; work on all major browsers.
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;Well, I’d been thinking about this problem for a while, but had delayed working on it because I just didn’t want to fiddle with IE. While I’d been thinking about it, the &lt;a href=&quot;https://github.com/futurepress/epub.js/commit/f2fa7497939e5876ff6676cf8de34d7284498495#diff-04c6e90faac2675aa89e2176d2eec7d8&quot; target=&quot;_blank&quot;&gt;EPUB.js instructions were updated&lt;/a&gt; with IE-specific steps. I didn’t have to look far.&lt;/p&gt;

&lt;p&gt;After loading &lt;code&gt;wgxpath.install.js&lt;/code&gt; in the header, I just had to add this bit of JavaScript before anything important happened:&lt;/p&gt;

&lt;pre lang=&quot;javascript&quot; line=&quot;1&quot;&gt;
// Internet Explorer workaround.
if (!window.XPathResult) {
    EPUBJS.Hooks.register(&quot;beforeChapterDisplay&quot;).wgxpath = function(callback, renderer){
       wgxpath.install(renderer.render.window);

       if (callback) callback();
    };
    wgxpath.install(window);
}
&lt;/pre&gt;

&lt;p&gt;You can see on line 2 that I test for &lt;code&gt;window.XPathResult&lt;/code&gt; instead of looking for a user agent or anything like that. That’s because it’s not really IE I’m interested in detecting. I want to find out if XPath is both available and somewhat standard. User agents are unreliable. &lt;a href=&quot;http://learn.jquery.com/code-organization/feature-browser-detection/&quot; target=&quot;_blank&quot;&gt;Always test for feature availability instead!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://arnesonium.com/wp-content/uploads/2015/02/Screenshot-from-2015-02-11-133823.png&quot; alt=&quot;Recent web browser usage&quot; width=&quot;350&quot; height=&quot;130&quot; class=&quot;alignright size-full wp-image-279&quot; /&gt;The results are good enough for now: the Online Reader works in IE, but it’s not perfect. The cover image doesn’t load full-size and fonts don’t seem to be loading correctly. IE users account for only 10% of the traffic on the website, so obviously I need to work on the EPUB.js cross-browser support. For now, though, it works. And it looks great on Chrome, Safari, and Firefox.&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>How to Test Your Frontend Against Internet Explorer Without Booting Windows</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2015/02/test-internet-explorer-without-booting-windows/" rel="alternate" type="text/html" title="How to Test Your Frontend Against Internet Explorer Without Booting Windows" />
        <updated>2015-02-11T19:15:26+00:00</updated>
        <id>https://arnesonium.com/2015/02/test-internet-explorer-without-booting-windows</id>
          <category term="debugging" />
        
          <category term="epub" />
        
          <category term="internet-explorer" />
        
          <category term="javascript" />
        
          <category term="programming" />
        
          <category term="testing" />
        
          <category term="web-development" />
        
          <category term="windows" />
        <content type="html" xml:base="https://arnesonium.com/2015/02/test-internet-explorer-without-booting-windows/">&lt;p&gt;Internet Explorer (IE) has been frustrating me. I want to use stronger words than that, but it would be unprofessional.
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;I recently launched the &lt;a href=&quot;http://arnesonium.com/2015/01/philalethes-e-bulletin-online-reader/&quot; title=&quot;Philalethes E-Bulletin Online Reader&quot;&gt;&lt;em&gt;Philalethes E-Bulletin&lt;/em&gt; Online Reader&lt;/a&gt;, which uses EPUB.js and an implementation of XPath that, for some strange reason, isn’t available in IE. I found a few solutions which would work, but all of them require testing in IE. Of course.&lt;/p&gt;

&lt;p&gt;This seems like it wouldn’t be a problem, except that I run Linux all the time. All of my work happens on the Linux side of things, so booting into Windows just to run IE for one tiny bug fix is an inconvenience and a chore.
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;A friend of mine pointed me to &lt;a href=&quot;https://www.modern.ie/&quot; title=&quot;modern.IE: Virtual Machines for running Internet Explorer&quot; target=&quot;_blank&quot;&gt;modern.IE&lt;/a&gt;. Microsoft has graciously released virtual machines usable under MacOS and Linux for running IE and testing. Be warned, however, that the license only lasts 90 days.&lt;/p&gt;

&lt;p&gt;I downloaded the 3.5GB virtual machine image and loaded it up in VirtualBox. This might be unusual, but I don’t do a lot of work with virtual machines on my development box. I was immediately greeted with this:
[caption id=”attachment_269” align=”aligncenter” width=”530”]&lt;img src=&quot;http://arnesonium.com/wp-content/uploads/2015/02/Screenshot-from-2015-02-11-094245.png&quot; alt=&quot;Don&amp;#039;t worry, the loading time was a lie. It only took 5 minutes.&quot; width=&quot;530&quot; height=&quot;423&quot; class=&quot;size-full wp-image-269&quot; /&gt; Don’t worry, the loading time was a lie. It only took 5 minutes.[/caption]&lt;/p&gt;

&lt;p&gt;This solution is not the best for my setup. My computer is getting long in the tooth, so VirtualBox runs neither quickly nor smoothly. However, in this situation, I only needed to test a few lines of code, so it worked.&lt;/p&gt;

&lt;p&gt;In my next blog post, which should be coming out shortly, I’ll talk about how I got the &lt;em&gt;Philalethes E-Bulletin&lt;/em&gt; Online Reader working for IE.&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>When to Develop Apps From Scratch</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2015/02/when-to-develop-apps-from-scratch/" rel="alternate" type="text/html" title="When to Develop Apps From Scratch" />
        <updated>2015-02-03T20:56:10+00:00</updated>
        <id>https://arnesonium.com/2015/02/when-to-develop-apps-from-scratch</id>
          <category term="management" />
        
          <category term="optimization" />
        
          <category term="programming" />
        
          <category term="publishing" />
        
          <category term="web-design" />
        
          <category term="web-development" />
        <content type="html" xml:base="https://arnesonium.com/2015/02/when-to-develop-apps-from-scratch/">&lt;p&gt;I haven’t had time to write anything interesting for the blog this week, so instead check out Sebastian Green’s article, &lt;a href=&quot;http://www.developerdrive.com/2015/02/a-transparent-box-the-case-for-developing-from-scratch/&quot; target=&quot;_blank&quot;&gt;“A transparent box: the case for developing from scratch,”&lt;/a&gt; which has been published over at Developer Drive.&lt;/p&gt;

&lt;p&gt;Mr Green makes some great arguments for developing from scratch. Good software takes good planning, no matter what.&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Integrating Cedexis Radar with WordPress Sites</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2015/01/integrating-cedexis-radar-with-wordpress-sites/" rel="alternate" type="text/html" title="Integrating Cedexis Radar with WordPress Sites" />
        <updated>2015-01-26T20:00:52+00:00</updated>
        <id>https://arnesonium.com/2015/01/integrating-cedexis-radar-with-wordpress-sites</id>
          <category term="cedexis" />
        
          <category term="performance" />
        
          <category term="php" />
        
          <category term="plugin" />
        
          <category term="programming" />
        
          <category term="web-development" />
        
          <category term="web-performance" />
        
          <category term="wordpress" />
        <content type="html" xml:base="https://arnesonium.com/2015/01/integrating-cedexis-radar-with-wordpress-sites/">&lt;p&gt;&lt;a href=&quot;http://www.cedexis.com/radar/&quot; target=&quot;_blank&quot;&gt;Cedexis Radar&lt;/a&gt; is a real user monitoring (RUM) system that collects millions of metrics every day. It’s used to measure the health of networks in order for &lt;a href=&quot;http://www.cedexis.com/openmix/&quot; target=&quot;_blank&quot;&gt;Cedexis Openmix&lt;/a&gt; to make intelligent routing decisions for web service users.
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://cedexis.com&quot;&gt;&lt;img src=&quot;/wp-content/uploads/2015/01/logo-cedexis.png#right&quot; alt=&quot;Cedexis Logo&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I put together &lt;a href=&quot;/cedexis-radar-tracking-for-wordpress/&quot; title=&quot;Cedexis Radar Tracking for WordPress&quot;&gt;a simple plugin&lt;/a&gt; to add Cedexis Radar tracking codes to a WordPress website. I’m not yet sure how much of an overlap there is between WordPress users and Cedexis Openmix users, but if you’re using both, &lt;a href=&quot;/cedexis-radar-tracking-for-wordpress/&quot; title=&quot;Cedexis Radar Tracking for WordPress&quot;&gt;check out my new plugin&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sometime between 2015 and 2022, Cedexis was purchased by Citrix and no longer exists.&lt;/em&gt;&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Web Page Size is Vital</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2015/01/web-page-size-is-vital/" rel="alternate" type="text/html" title="Web Page Size is Vital" />
        <updated>2015-01-19T20:05:17+00:00</updated>
        <id>https://arnesonium.com/2015/01/web-page-size-is-vital</id>
          <category term="optimization" />
        
          <category term="performance" />
        
          <category term="programming" />
        
          <category term="web-design" />
        
          <category term="web-development" />
        <content type="html" xml:base="https://arnesonium.com/2015/01/web-page-size-is-vital/">&lt;p&gt;When I first learned how to program a computer, optimization was a big deal. Figuring out how to squeeze every bit of performance out of a subroutine was difficult but rewarding. Articles were frequently written about how to best go about optimizing source code.
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;In the late 1990s, I began working on my first web applications. Bandwidth was expensive, so we worked on ways to make our websites more compact. We &lt;a href=&quot;http://www.feedthebot.com/pagespeed/enable-compression.html&quot; target=&quot;_blank&quot;&gt;compressed web pages&lt;/a&gt; and figured out ways to strip out whitespace. However, today websites have quite a bit going on in the front of the house. There’s a lot of JavaScript and CSS that gets passed to the browser, and as a result, web applications are transmitting more data than ever.&lt;/p&gt;

&lt;p&gt;Tammy Everts writes a blog called &lt;a href=&quot;http://www.webperformancetoday.com/&quot; title=&quot;Web Performance Today&quot; target=&quot;_blank&quot;&gt;Web Performance Today&lt;/a&gt;, where she follows trends in web application development. It is essential for web developers to pay attention to the amount of data they send to users and how that affects application performance.&lt;/p&gt;

&lt;p&gt;https://twitter.com/tameverts/status/555780016563564544&lt;/p&gt;

&lt;p&gt;Ms Everts has shown over and over that web pages are growing. She points out that the average web page has &lt;a href=&quot;http://www.webperformancetoday.com/2014/12/02/page-bloat-update-average-top-1000-web-page-1795-kb-size/&quot; target=&quot;_blank&quot;&gt;grown 186% since 2010&lt;/a&gt;, and it shows no sign of stopping. I believe that every responsible web developer owes it to himself ((Or herself.)) to follow Ms Everts’ blog.&lt;/p&gt;

&lt;p&gt;Please, fellow web developers, pay attention to how big your web pages are getting. Let’s reverse this trend.&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Hypothes.is Web Annotation Tool</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2015/01/hypothes-is-web-annotation-tool/" rel="alternate" type="text/html" title="Hypothes.is Web Annotation Tool" />
        <updated>2015-01-14T23:38:13+00:00</updated>
        <id>https://arnesonium.com/2015/01/hypothes-is-web-annotation-tool</id>
          <category term="javascript" />
        
          <category term="programming" />
        
          <category term="tools" />
        
          <category term="web-development" />
        <content type="html" xml:base="https://arnesonium.com/2015/01/hypothes-is-web-annotation-tool/">&lt;p&gt;While working on the &lt;a title=&quot;Philalethes E-Bulletin Online Reader&quot; href=&quot;/2015/01/philalethes-e-bulletin-online-reader/&quot;&gt;&lt;em&gt;Philalethes E-Bulletin&lt;/em&gt; Online Reader&lt;/a&gt;, I came across a useful web-based annotation tool called &lt;a title=&quot;Hypothes.is: The Web, Annotated&quot; href=&quot;http://hypothes.is/&quot; target=&quot;_blank&quot;&gt;Hypothes.is&lt;/a&gt;. It’s worth checking out. The tool uses a browser plugin to provide a number of cool features.
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://hypothes.is/&quot;&gt;&lt;img src=&quot;/wp-content/uploads/2015/01/hypothelogo_light2.png#right&quot; alt=&quot;Hypothes.is Logo&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Annotation&lt;/li&gt;
	&lt;li&gt;Discussion&lt;/li&gt;
	&lt;li&gt;Tagging&lt;/li&gt;
	&lt;li&gt;Sharing&lt;/li&gt;
	&lt;li&gt;Privacy Control&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It also provides an &lt;a title=&quot;Hypothes.is annotation stream&quot; href=&quot;https://hypothes.is/stream&quot; target=&quot;_blank&quot;&gt;annotation stream&lt;/a&gt; that allows you to view public annotations as they’re being made all over the web.&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Philalethes E-Bulletin Online Reader</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2015/01/philalethes-e-bulletin-online-reader/" rel="alternate" type="text/html" title="Philalethes E-Bulletin Online Reader" />
        <updated>2015-01-12T22:33:11+00:00</updated>
        <id>https://arnesonium.com/2015/01/philalethes-e-bulletin-online-reader</id>
          <category term="epub" />
        
          <category term="freemasonry" />
        
          <category term="javascript" />
        
          <category term="php" />
        
          <category term="programming" />
        
          <category term="publishing" />
        
          <category term="web-development" />
        <content type="html" xml:base="https://arnesonium.com/2015/01/philalethes-e-bulletin-online-reader/">&lt;p&gt;I began working on the &lt;a href=&quot;http://freemasonry.org/ebulletin/&quot; title=&quot;Philalethes E-Bulletin&quot; target=&quot;_blank&quot;&gt;&lt;em&gt;Philalethes E-Bulletin&lt;/em&gt;&lt;/a&gt; in the Fall of 2013, and published the first issue in January of 2014. The &lt;em&gt;E-Bulletin&lt;/em&gt; is published quarterly in EPUB and MOBI formats.
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2014/12/Screenshot-from-2014-12-18-214441.png#left&quot; alt=&quot;Philalethes Society Seal&quot; width=&quot;203&quot; height=&quot;171&quot; class=&quot;alignright size-full wp-image-189&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It’s been a great learning experience. Not only have I learned a lot about editing, but I’ve really had to dive into how electronic publishing works. The intricacies of electronic book formats have become well-known to me.&lt;/p&gt;

&lt;p&gt;The Philalethes Society isn’t entirely comfortable with modern technology, however. Most complaints about the &lt;em&gt;E-Bulletin&lt;/em&gt; came from those who didn’t have e-book readers and weren’t comfortable installing software on their PC to handle a new file format. Because of this, I built an online e-book reader specifically for the &lt;em&gt;E-Bulletin&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The online e-book reader is based around the excellent &lt;a href=&quot;https://github.com/futurepress/epub.js/&quot; target=&quot;_blank&quot;&gt;EPUB.js library&lt;/a&gt;, with additional backend code written in PHP.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://freemasonry.org/ebulletin/reader/&quot; title=&quot;Philalethes E-Bulletin Online Reader&quot; target=&quot;_blank&quot;&gt;Click here to visit the &lt;em&gt;Philalethes E-Bulletin&lt;/em&gt; Online Reader.&lt;/a&gt;&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Small Team Software Change Management</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2014/12/small-team-software-change-management/" rel="alternate" type="text/html" title="Small Team Software Change Management" />
        <updated>2014-12-18T01:45:51+00:00</updated>
        <id>https://arnesonium.com/2014/12/small-team-software-change-management</id>
          <category term="freshbooks" />
        
          <category term="git" />
        
          <category term="github" />
        
          <category term="management" />
        
          <category term="programming" />
        
          <category term="web-development" />
        <content type="html" xml:base="https://arnesonium.com/2014/12/small-team-software-change-management/">&lt;p&gt;Until October, I’d been using a paid &lt;a href=&quot;http://github.com/&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt; account to manage source code changes and issue tracking for private projects. GitHub is a software-as-a-service (SaaS) product providing a web-based interface for source control management and various project tracking tasks. &lt;a href=&quot;http://blogs.perl.org/users/jt_smith/2011/12/github-is-an-amazing-service-that-much-of-the-perl-community-has.html&quot; target=&quot;_blank&quot;&gt;Some people love it&lt;/a&gt; and &lt;a href=&quot;http://laurent.bachelier.name/2012/05/github-kinda-sucks/&quot; target=&quot;_blank&quot;&gt;some aren’t fond of it&lt;/a&gt;.
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;My software development clients are typically small companies wanting fairly simple web applications. They hire me because having a developer on staff doesn’t fit into their budget or business plan. They don’t usually care what the source code for their project looks like, but they do care about tracking issues.&lt;/p&gt;

&lt;p&gt;Because of the scope of these applications, it’s rare that I work with other programmers. This meant that I wasn’t using any of the special features of GitHub for private code repositories, so in October I cancelled my subscription.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://eriklarneson.freshbooks.com/refer/www&quot;&gt;&lt;img src=&quot;/wp-content/uploads/2014/12/FreshBooks_Cloud_Accounting_Logo.png#right&quot; alt=&quot;FreshBooks&quot; /&gt;&lt;/a&gt;My private repositories are now self-hosted, and I browse them using &lt;a href=&quot;http://gitlist.org/&quot; target=&quot;_blank&quot;&gt;GitList&lt;/a&gt;, which bills itself as “an elegant and modern git repository viewer.” It looks nice, and I’ve got no complaints. For issue tracking, I use &lt;a href=&quot;https://eriklarneson.freshbooks.com/refer/www&quot; target=&quot;_blank&quot;&gt;Freshbooks&lt;/a&gt;, a SaaS accounting system. With Freshbooks, I can not only keep track of bug reports and issues, but I can record time spent on bug reports, feature creep, and other client-related issues.&lt;/p&gt;

&lt;p&gt;GitList and Freshbooks isn’t a perfect solution. At some point, I will be working with another developer, and we will need a way to track bugs and issues internally. When that happens, I plan to deploy &lt;a href=&quot;http://gitolite.com/gitolite/index.html&quot; target=&quot;_blank&quot;&gt;Gitolite&lt;/a&gt; and find some new issue-tracking solution.&lt;/p&gt;

&lt;p&gt;By the way, another reason I stopped using paid GitHub features is because &lt;a href=&quot;http://www.businessweek.com/articles/2013-06-20/github-got-silly-rich-dot-next-step-make-more-awesome&quot; target=&quot;_blank&quot;&gt;they’ve already made plenty of money&lt;/a&gt;, and I’m not sure they’re doing the right things with all of that money.&lt;/p&gt;

&lt;p&gt;I’m curious about what others are using. How does your incredibly small team track code changes and issues? Are all of your software issues internal, or are you developing for clients? I’d love to hear some ideas.&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Bootstrap and WordPress</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2014/12/bootstrap-and-wordpress/" rel="alternate" type="text/html" title="Bootstrap and WordPress" />
        <updated>2014-12-09T16:44:32+00:00</updated>
        <id>https://arnesonium.com/2014/12/bootstrap-and-wordpress</id>
          <category term="bootstrap" />
        
          <category term="themes" />
        
          <category term="web-design" />
        
          <category term="web-development" />
        
          <category term="wordpress" />
        <content type="html" xml:base="https://arnesonium.com/2014/12/bootstrap-and-wordpress/">&lt;p&gt;I’ve used &lt;a href=&quot;http://getbootstrap.com/&quot; target=&quot;_blank&quot;&gt;Twitter Bootstrap&lt;/a&gt; many times in web applications. It really makes building an application interface fast and easy, primarily because I don’t have to worry much about design. Bootstrap makes things a lot easier for a developer who doesn’t do good design work.
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;Speaking of design work, this website is not very pretty at the moment. I want to make it look better, so I’ve been looking at different WordPress themes. A theme based on Bootstrap seemed like a good idea. That way, the appearance of my website would match the applications I’ve built for my clients. Nice, right? I came across &lt;a href=&quot;http://320press.com/wpbs/&quot; target=&quot;_blank&quot;&gt;WordPress Bootstrap&lt;/a&gt; from &lt;a href=&quot;http://320press.com/&quot; target=&quot;_blank&quot;&gt;320 Press&lt;/a&gt; and thought it might look good.&lt;/p&gt;

&lt;p&gt;I decided to pursue other themes, however. My initial concern was that the website didn’t look any better with WordPress Bootstrap, but I also realized that perhaps Bootstrap wasn’t such a good fit for WordPress. Fränk Klein makes some great arguments against a Bootstrap-backed WordPress theme in his article, &lt;a href=&quot;http://themeshaper.com/2014/08/19/why-bootstrap-is-a-bad-fit-for-wordpress-themes/&quot; target=&quot;_blank&quot;&gt;Why Bootstrap is a Bad Fit for WordPress Themes&lt;/a&gt;.&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>PunchlinePDX Event Manager</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2014/12/punchlinepdx-event-manager/" rel="alternate" type="text/html" title="PunchlinePDX Event Manager" />
        <updated>2014-12-08T17:23:17+00:00</updated>
        <id>https://arnesonium.com/2014/12/punchlinepdx-event-manager</id>
          <category term="database" />
        
          <category term="javascript" />
        
          <category term="php" />
        
          <category term="programming" />
        
          <category term="web-development" />
        <content type="html" xml:base="https://arnesonium.com/2014/12/punchlinepdx-event-manager/">&lt;p&gt;&lt;a href=&quot;http://www.punchlinepdx.com/&quot;&gt;PunchlinePDX&lt;/a&gt; is a slow-motion video booth for events and parties based out of Portland, Oregon. Earlier this year, I helped them develop event management software that would allow them to upload and curate video.
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;This was their first experience hiring a software developer, so I had the opportunity to walk them through the entire process. We started by outlining requirements and coming up with a solid plan with application screens, functions, and things to meet their business needs. We then brainstormed additional features and came up with something pretty amazing.&lt;/p&gt;

&lt;p&gt;These are a few of the interesting things we came up with:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;Cloud-backed storage for all videos&lt;/li&gt;
    &lt;li&gt;Text messaging interface&lt;/li&gt;
    &lt;li&gt;Smart social media sharing&lt;/li&gt;
    &lt;li&gt;Contact management&lt;/li&gt;
    &lt;li&gt;Event and sharing privacy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The best part was the testing process. While I ran them through their new software, they made slow-motion video of me and used the software to upload and manage it. Check it out!&lt;/p&gt;

&lt;video controls=&quot;&quot; autoplay=&quot;&quot; loop=&quot;&quot; style=&quot;width:98%&quot; poster=&quot;https://punchline-staging.s3.amazonaws.com/event-5-video-14.jpg&quot;&gt;
   &lt;source src=&quot;https://punchline-staging.s3.amazonaws.com/event-5-video-14.mp4&quot; type=&quot;video/mp4&quot; /&gt;
   Your browser does not support the video tag.
&lt;/video&gt;

&lt;p&gt;&lt;strong&gt;You should seriously consider booking these guys for your holiday party.&lt;/strong&gt;&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Website: Bruno San Rafael&apos;s Home for Former Trapeze</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2014/11/website-bruno-san-rafaels-home-for-former-trapeze/" rel="alternate" type="text/html" title="Website: Bruno San Rafael's Home for Former Trapeze" />
        <updated>2014-11-24T17:29:56+00:00</updated>
        <id>https://arnesonium.com/2014/11/website-bruno-san-rafaels-home-for-former-trapeze</id>
          <category term="html" />
        
          <category term="javascript" />
        
          <category term="programming" />
        
          <category term="web-development" />
        
          <category term="portfolio" />
        <content type="html" xml:base="https://arnesonium.com/2014/11/website-bruno-san-rafaels-home-for-former-trapeze/">&lt;p&gt;Back in 2012, I had the pleasure of working with my good friend Joel Barker on his amazing project, &lt;a href=&quot;http://brunosanrafael.com/&quot;&gt;Bruno San Rafael’s Home for Former Trapeze&lt;/a&gt;. This project is a collaboration between Joel, a bunch of musicians, a photographer, and a web developer (me!). My contribution was probably the smallest of the bunch, but it was a lot of fun.
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;Please check out the website by clicking on the screenshot below. If you use “View Source” in your browser, you can see every line of code I used to finish the site. It’s one simple, medium-length monolithic HTML file with JavaScript and CSS thrown in.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://brunosanrafael.com/&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;aligncenter size-large wp-image-60&quot; src=&quot;/wp-content/uploads/2014/11/Screenshot-from-2014-11-13-092922-1024x499.png&quot; alt=&quot;Bruno San Rafael&quot; width=&quot;580&quot; height=&quot;282&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I now work with Joel regularly at &lt;a href=&quot;http://www.wordlions.com/&quot;&gt;Word Lions&lt;/a&gt;, where I write and do a little more website development.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;</content>
      </entry>
    
</feed>
