<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:foaf="https://xmlns.com/foaf/0.1/" xmlns:og="https://ogp.me/ns#" xmlns:rdfs="https://www.w3.org/2000/01/rdf-schema#" xmlns:schema="https://schema.org/" xmlns:sioc="https://rdfs.org/sioc/ns#" xmlns:sioct="https://rdfs.org/sioc/types#" xmlns:skos="https://www.w3.org/2004/02/skos/core#" xmlns:xsd="https://www.w3.org/2001/XMLSchema#" version="2.0" xml:base="https://www.linuxjournal.com/tag/web-development">
  <channel>
    <title>Web Development</title>
    <link>https://www.linuxjournal.com/tag/web-development</link>
    <description/>
    <language>en</language>
    
    <item>
  <title>FOSS Project Spotlight: the Codelobster IDE--a Free PHP, HTML, CSS and JavaScript Editor</title>
  <link>https://www.linuxjournal.com/content/foss-project-spotlight-codelobster-ide-free-php-html-css-and-javascript-editor</link>
  <description>  &lt;div data-history-node-id="1339849" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
      
            &lt;div class="field field--name-field-node-image field--type-image field--label-hidden field--item"&gt;  &lt;img src="https://www.linuxjournal.com/sites/default/files/nodeimage/story/CodeLobster-logo.png" width="200" height="200" alt="""" typeof="foaf:Image" class="img-responsive" /&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-author field--type-ds field--label-hidden field--item"&gt;by &lt;a title="View user profile." href="https://www.linuxjournal.com/users/stanislav-ustimenko" lang="" about="https://www.linuxjournal.com/users/stanislav-ustimenko" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;Stanislav Ustimenko&lt;/a&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"&gt;&lt;p&gt;
The Codelobster free web language editor has been available for quite some
time and has attracted many fans. It allows you to edit PHP, HTML, CSS and
JavaScript files, and it highlights the syntax and provides hints for tags,
functions and their parameters. This editor deals with files that contain
mixed content easily as well.
&lt;/p&gt;

&lt;p&gt;
If you insert PHP code in your HTML template, the editor correctly
highlights both HTML tags and PHP functions. The same applies to CSS and
JavaScript code, which is contained in HTML files.
The program also includes an auto-completion function, which greatly speeds up
work for programmers and eliminates the possibility of errors.
&lt;/p&gt;


&lt;img src="https://www.linuxjournal.com/sites/default/files/styles/max_1300x1300/public/u%5Buid%5D/codelobsterf1.png" width="1300" height="555" alt="""" class="image-max_1300x1300" /&gt;&lt;p&gt;
The &lt;a href="https://codelobsteride.com"&gt;Codelobster IDE&lt;/a&gt; provides contextual help on all supported programming
languages, and it uses the most up-to-date documentation, downloading it
from official sites so you quickly can get a description of any HTML tag,
CSS attribute, PHP or JavaScript function by pressing the F1 key.
&lt;/p&gt;

&lt;p&gt;
The built-in PHP debugger allows you to execute PHP scripts step by step,
sequentially moving through the lines of code. You can assign check points,
view the process of the work of loops and monitor the values of all
variables during the execution of a script.
&lt;/p&gt;

&lt;p&gt;
You can view the HTML templates directly in the editor, highlight the
interesting elements on a page and explore the associated CSS styles. The
HTML and CSS inspector works by following the well known FireBug principle.
&lt;/p&gt;

&lt;p&gt;
Other useful functions and features of the IDE include:
&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;
Pair-highlighting of parentheses and tags—you'll never need to count
parentheses or quotation marks; the editor takes care of it for you.
&lt;/li&gt;

&lt;li&gt;
Highlighting of blocks, selection and collapsing of code snippets, bookmarks
to facilitate navigation on edited files, recognition and building of the
complete structure of PHP projects—all of these functions ensure easy
work with projects of any scale.
&lt;/li&gt;

&lt;li&gt;
Support for 17 user-interface languages, including English, German, Russian,
Spanish, French and more.
&lt;/li&gt;

&lt;li&gt;
The program works on the following operating systems: Windows 7, Windows 8,
Windows 10, macOS, Linux, Ubuntu, Fedora and Debian.
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;
The professional version of the Codelobster IDE provides programmers with
even more features.
&lt;/p&gt;
&lt;p&gt;
For example, you can work with projects on a remote server with the use of
the built-in FTP client. You can edit the selected files, preview the
results and then synchronize the changes with the files on the hosting side.
&lt;/p&gt;

&lt;p&gt;
In addition, the professional version includes an extensive set of plugins:
&lt;/p&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-link field--type-ds field--label-hidden field--item"&gt;  &lt;a href="https://www.linuxjournal.com/content/foss-project-spotlight-codelobster-ide-free-php-html-css-and-javascript-editor" hreflang="en"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Sat, 09 Jun 2018 14:01:43 +0000</pubDate>
    <dc:creator>Stanislav Ustimenko</dc:creator>
    <guid isPermaLink="false">1339849 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>How-to Take the Plunge and Replace the "I'm not a programmer" Mantra</title>
  <link>https://www.linuxjournal.com/content/where-do-i-start</link>
  <description>  &lt;div data-history-node-id="1339559" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
      
            &lt;div class="field field--name-field-node-image field--type-image field--label-hidden field--item"&gt;  &lt;img src="https://www.linuxjournal.com/sites/default/files/nodeimage/story/maxpixel.freegreatpicture.com-Computer-Program-Programming-Data-Networking-Code-1486361.jpg" width="640" height="426" alt="" typeof="foaf:Image" class="img-responsive" /&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-author field--type-ds field--label-hidden field--item"&gt;by &lt;a title="View user profile." href="https://www.linuxjournal.com/users/reuven-m-lerner" lang="" about="https://www.linuxjournal.com/users/reuven-m-lerner" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;Reuven M. Lerner&lt;/a&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"&gt;&lt;p&gt;
For the past few years, the bulk of my consulting work has been in
corporate training. Many of the participants in my courses are people
who have been developing software for years already and simply want
to learn new languages and techniques. But, there are also those who are new to
programming; they realize the potential that programming skills can
have for their careers and are excited to learn, but they aren't
necessarily sure where to start.
&lt;/p&gt;

&lt;p&gt;
Moreover, given how pervasive websites (not to mention mobile apps)
are in the modern world, people don't merely want to program. They want
to build web applications. They want to build mobile apps. They want
to start to control their computers and not just be passive users.
&lt;/p&gt;

&lt;p&gt;
And, although &lt;em&gt;Linux Journal&lt;/em&gt; readers tend to be people in technical careers
and positions, many of you are likely similar to the network
engineers, system administrators, sales engineers and data scientists
who use Linux and open-source software all the time, but haven't
ever considered themselves programmers.
&lt;/p&gt;

&lt;p&gt;
So in this article, I'm encouraging you to try to learn to program, to get
started and to build some simple web applications. I'm not going to
say that it's something you can do in a few minutes; you
definitely will need to learn a number of different skills. But, you know
what? Everyone, including those who have been programming for years,
constantly needs to learn new things and improve skills to keep up with
ever-changing technology.
&lt;/p&gt;

&lt;p&gt;
So if you're ready for a lifetime of excitement, and also for
never-ending learning and improvement, I definitely encourage you
to take the plunge and replace the "I'm not a programmer" mantra with a
sense that yes, you can indeed do it.
&lt;/p&gt;

&lt;h3&gt;
Language&lt;/h3&gt;

&lt;p&gt;
Perhaps the biggest question that newcomers (and potential newcomers)
to programming ask me is this: "What language should I learn?"
&lt;/p&gt;

&lt;p&gt;
They ask this for a few different reasons. First, they want a language
that will be practical for their work. Second, they want a language
that is fairly easy to use. Third, they want a language that has the
capabilities that are of interest to them.
&lt;/p&gt;

&lt;p&gt;
So, let me get a few things out of the way. You almost inevitably
will need to learn a few different programming languages during the course of
your career. All of them are equally capable. However, some languages
have steeper learning curves than others, expecting you to come in
with more knowledge than others.
&lt;/p&gt;

&lt;p&gt;
I also should add that many newcomers to programming aren't coming in
with zero background. They're arriving with some programming skills,
such as bash scripting. Bash is a language, and I've seen all sorts
of amazing things done with it, but as a general rule, I'm talking
about higher-level and more sophisticated languages that can do more
with less code.
&lt;/p&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-link field--type-ds field--label-hidden field--item"&gt;  &lt;a href="https://www.linuxjournal.com/content/where-do-i-start" hreflang="und"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Sat, 06 Jan 2018 16:15:14 +0000</pubDate>
    <dc:creator>Reuven M. Lerner</dc:creator>
    <guid isPermaLink="false">1339559 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>Integrating Web Applications with Apache</title>
  <link>https://www.linuxjournal.com/content/integrating-web-applications-apache</link>
  <description>  &lt;div data-history-node-id="1339469" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
      
            &lt;div class="field field--name-field-node-image field--type-image field--label-hidden field--item"&gt;  &lt;img src="https://www.linuxjournal.com/sites/default/files/nodeimage/story/computer-156951_640_1.png" width="501" height="600" alt="""" typeof="foaf:Image" class="img-responsive" /&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-author field--type-ds field--label-hidden field--item"&gt;by &lt;a title="View user profile." href="https://www.linuxjournal.com/users/andy-carlson" lang="" about="https://www.linuxjournal.com/users/andy-carlson" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;Andy Carlson&lt;/a&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"&gt;&lt;p&gt;
When you deploy a web application, how do end users access it?
Often web applications are set behind a gateway device through which
end users can access it. One of the popular products to act as
an application gateway on Linux is the Apache Web Server. Although it can
function as a normal web server, it also has the ability to connect through
it to other web servers.
&lt;/p&gt;
&lt;p&gt;
In this article, I discuss what it takes to
integrate a web application into Apache. This includes integrating the
HTTP protocol functionality, customizing content to render properly and
reusing pieces of configuration. Once you understand those basic bits of
functionality,
you'll have the tools you need to maximize your web applications'
usability. So, let's get started!
&lt;/p&gt;


&lt;h3&gt;
Crash Course in RegEx&lt;/h3&gt;

&lt;p&gt;
A mechanism that I use throughout this article that might need a brief
introduction is Regular Expressions (or regex). Regex is used to define
a text pattern to search for within a URL or to find and replace text
within content, such as HTML or JavaScript. The text processing command
&lt;code&gt;sed&lt;/code&gt; uses regex to do searches and substitutions.
&lt;/p&gt;

&lt;p&gt;
For each example
below there will be three parts: input, regex pattern and output.
The pattern will be applied to the input text and determine the value
of the output text.
&lt;/p&gt;

&lt;p&gt;
&lt;em&gt;Example 1:&lt;/em&gt;

&lt;/p&gt;&lt;pre&gt;
&lt;code&gt;
Input:
  Name: Frank Sinatra
  Genre: Jazz
  Name: 2Pac
  Genre: Rap
  Name: Reel Big Fish
  Genre: Ska

Regex pattern: "^Name: "

Output:
  Name: Frank Sinatra
  Name: 2Pac
  Name: Reel Big Fish
&lt;/code&gt;
&lt;/pre&gt;


&lt;p&gt;
This example searches the input text for text that matches
the pattern &lt;code&gt;"^Name: "&lt;/code&gt;. This pattern says, "Look for the text 'Name:
' at the beginning of each line." Since there are two lines that
begin with that text, only those two lines are returned. While
"^"
represents the beginning of a line, "$" represents the end of a line.
So if you were to apply the pattern "a$", two lines would be returned
(Frank Sinatra and Ska). Let's expand on that example and use
the input from Example 1 with a new pattern.
&lt;/p&gt;

&lt;p&gt;
&lt;em&gt;Example 2:&lt;/em&gt;

&lt;/p&gt;&lt;pre&gt;
&lt;code&gt;
Regex pattern: "^Name: [0-9]"

Output:
  Name: 2Pac
&lt;/code&gt;
&lt;/pre&gt;


&lt;p&gt;
As you can see, I've taken the original regex pattern and added
&lt;code&gt;[0-9]&lt;/code&gt;
to the end. This will search for a single character that can be any
number from 0 to 9, which is why "2Pac" was the only line
returned.
You also can specify a range with alphabetic characters
(&lt;code&gt;[a-z]&lt;/code&gt; or &lt;code&gt;[A-Z]&lt;/code&gt;).
&lt;/p&gt;

&lt;p&gt;
Along with pattern selection, you also can do
substitution with regex.
There are two formats for regex substitutions: s|pattern|replace|modifier
or s/pattern/replace/modifier. In Apache, I find it easier to use the
pipe-style substitution. Example 3 uses the same input
with a new pattern.
&lt;/p&gt;

&lt;p&gt;
&lt;em&gt;Example 3:&lt;/em&gt;

&lt;/p&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-link field--type-ds field--label-hidden field--item"&gt;  &lt;a href="https://www.linuxjournal.com/content/integrating-web-applications-apache" hreflang="und"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Tue, 22 Aug 2017 12:36:27 +0000</pubDate>
    <dc:creator>Andy Carlson</dc:creator>
    <guid isPermaLink="false">1339469 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>Celtra's AdCreator Platform</title>
  <link>https://www.linuxjournal.com/content/celtras-adcreator-platform</link>
  <description>  &lt;div data-history-node-id="1339442" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
      
            &lt;div class="field field--name-field-node-image field--type-image field--label-hidden field--item"&gt;  &lt;img src="https://www.linuxjournal.com/sites/default/files/nodeimage/story/12202f3.jpg" width="800" height="436" alt="" typeof="foaf:Image" class="img-responsive" /&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-author field--type-ds field--label-hidden field--item"&gt;by &lt;a title="View user profile." href="https://www.linuxjournal.com/users/james-gray" lang="" about="https://www.linuxjournal.com/users/james-gray" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;James Gray&lt;/a&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"&gt;&lt;p&gt;
Mobile advertising campaigns today are often hampered by broken, non-viewable
ads with a poor UX experience. An important open-source initiative aimed at
solving this problem and making the web better for all is the AMP Project,
which enables the creation of websites and ads that are consistently fast,
beautiful and high-performing across devices and distribution platforms. 
&lt;/p&gt;

&lt;p&gt;
Now,
&lt;a href="https://www.celtra.com"&gt;Celtra&lt;/a&gt; AdCreator, a SaaS creative management platform for digital advertising,
integrates support for the creation of AMP Ads, a new standard for making ads
faster, lighter and more secure. Celtra foresees a transformative power in this
new product, because AMP helps pave the way for better creative, a significantly
improved customer experience and higher mobile ad engagement rates and
resulting ROI. Celtra AdCreator overcomes the barriers of cost of data and slow
network speed that make it difficult to engage with viewers meaningfully.
&lt;/p&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-link field--type-ds field--label-hidden field--item"&gt;  &lt;a href="https://www.linuxjournal.com/content/celtras-adcreator-platform" hreflang="und"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Mon, 17 Jul 2017 11:53:17 +0000</pubDate>
    <dc:creator>James Gray</dc:creator>
    <guid isPermaLink="false">1339442 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>nginx and WordPress</title>
  <link>https://www.linuxjournal.com/content/nginx-and-wordpress</link>
  <description>  &lt;div data-history-node-id="1339208" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
      
            &lt;div class="field field--name-field-node-image field--type-image field--label-hidden field--item"&gt;  &lt;img src="https://www.linuxjournal.com/sites/default/files/nodeimage/story/12112778334_5b731027e7_z_0.jpg" width="608" height="423" alt="" typeof="foaf:Image" class="img-responsive" /&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-author field--type-ds field--label-hidden field--item"&gt;by &lt;a title="View user profile." href="https://www.linuxjournal.com/users/reuven-m-lerner" lang="" about="https://www.linuxjournal.com/users/reuven-m-lerner" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;Reuven M. Lerner&lt;/a&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"&gt;&lt;p&gt;
In &lt;a href="https://www.linuxjournal.com/content/nginx"&gt;my last article&lt;/a&gt;, I took an initial look at nginx, the high-performance
open-source HTTP that uses a single process and a single thread to
service a large number of requests. nginx was designed for speed and
scalability, as opposed to Apache, which was designed to maximize
flexibility and configuration. But through the years, nginx has become
increasingly flexible as well, with a growing number of plugins and
modules that can be used to customize its configuration. Between the
performance, increasingly good documentation and convenience, it's no
wonder nginx has been increasingly popular.
&lt;/p&gt;

&lt;p&gt;
It's also no surprise that WordPress, the open-source blogging and CMS
platform, has become hugely popular. I've heard people say that 10% of
websites are now run using WordPress. Even if that's not precisely
true, there's no doubt that a huge number of sites are powered by
WordPress. I'm a mostly satisfied WordPress user, having converted my
main site and my two ebook sites to it in the past year after years
of using it to power my blog.
&lt;/p&gt;

&lt;p&gt;
So, I thought it would be interesting to demonstrate how easy it
is to set up WordPress with nginx, given the popularity of each of
these systems alone as well as together. In my last article, I described how you
can set up a plain-vanilla PHP system with nginx; WordPress is a bit
more complex, but less than you might think. Starting with a
bare-bones Linux installation, let's walk through the configuration
needed to get WordPress up and running.
&lt;/p&gt;

&lt;h3&gt;
The Basics&lt;/h3&gt;

&lt;p&gt;
In order to install WordPress and nginx together, you're going
to need three basic software systems installed: WordPress, nginx and
MySQL. The first two are pretty obvious, given this article's goal;
the third is a byproduct of using WordPress, which works exclusively
with MySQL.
&lt;/p&gt;

&lt;p&gt;
So, on my Ubuntu Linux machine, I would run the following:

&lt;/p&gt;&lt;pre&gt;
&lt;code&gt;
$ sudo apt-get install mysql-server mysql-client nginx-core
 ↪php5-cli php5-fpm php5-mysql
&lt;/code&gt;
&lt;/pre&gt;


&lt;p&gt;
This installs a very large number of packages, but it will give you
the core of what you need to get your system up and running. Notice
that you're not installing WordPress here, so that you can install it
manually, using the source code. Indeed, installing WordPress via
&lt;code&gt;apt-get&lt;/code&gt; also means installing Apache; although it's certainly possible to
undo this choice, the benefits of installing WordPress on your own
outweigh those of doing it via a package manager.
&lt;/p&gt;

&lt;p&gt;
You will, as part of this installation, need to choose a password for
your MySQL root user. This is an important part of security on your
system, so do try to use a strong password.
&lt;/p&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-link field--type-ds field--label-hidden field--item"&gt;  &lt;a href="https://www.linuxjournal.com/content/nginx-and-wordpress" hreflang="und"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Tue, 08 Nov 2016 12:13:35 +0000</pubDate>
    <dc:creator>Reuven M. Lerner</dc:creator>
    <guid isPermaLink="false">1339208 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>Let's Automate Let's Encrypt</title>
  <link>https://www.linuxjournal.com/content/lets-automate-lets-encrypt</link>
  <description>  &lt;div data-history-node-id="1339202" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
      
            &lt;div class="field field--name-field-node-image field--type-image field--label-hidden field--item"&gt;  &lt;img src="https://www.linuxjournal.com/sites/default/files/nodeimage/story/HTTPS_icon.png" width="600" height="300" alt="""" typeof="foaf:Image" class="img-responsive" /&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-author field--type-ds field--label-hidden field--item"&gt;by &lt;a title="View user profile." href="https://www.linuxjournal.com/users/andrei-lukovenko-0" lang="" about="https://www.linuxjournal.com/users/andrei-lukovenko-0" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;Andrei Lukovenko&lt;/a&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"&gt;&lt;p&gt;
HTTPS is a small island of security in this insecure world, and in this day
and age, there is absolutely no reason not to have it on every Web site you
host. Up until last year, there was just a single last excuse: purchasing
certificates was kind of pricey. That probably was not a big deal for
enterprises; however, if you routinely host a dozen Web sites, each
with multiple subdomains, and have to pay for each certificate
out of your own dear pocket—well, that quickly could become a burden.
&lt;/p&gt;

&lt;p&gt;
Now you have no more excuses. Enter &lt;a href="https://letsencrypt.org"&gt;Let's Encrypt&lt;/a&gt;
a free Certificate Authority
that officially left Beta status in April 2016.
&lt;/p&gt;

&lt;p&gt;
Aside from being totally free, there is another special thing about Let's
Encrypt certificates: they don't last long. Currently all certificates
issued by Let's Encrypt are &lt;a href="https://letsencrypt.org/2015/11/09/why-90-days.html"&gt;valid for only 90 days&lt;/a&gt;, and you should expect
that someday this term will become even shorter.
Although this short
lifespan definitely creates a much higher level of security, many people
consider it as an inconvenience, and I've seen people going back from
using Let's Encrypt to buying certificates from commercial certificate
authorities for this very reason.
&lt;/p&gt;

&lt;p&gt;
Of course, if you are running multiple Web sites, having to renew
several certificates manually every three months quickly could become
annoying to say the least. Some
day you even may forget (and you will regret that forgetfulness). Let's leave
routines to computers, right?
&lt;/p&gt;

&lt;p&gt;
If you are using Apache under a Debian-based distribution, Let's Encrypt
already has you covered with the libaugeas0 package, and it is
capable of both issuing and renewing certificates. If, like me, you
prefer nginx and want to have zero-downtime automatic certificate updates
with industrial-grade encryption, keep reading. I'm going to show you how to get
there.
&lt;/p&gt;

&lt;p&gt;
First things first—some assumptions and requirements:
&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;
&lt;p&gt;
You are running the &lt;a href="https://www.nginx.com"&gt;nginx&lt;/a&gt;
Web server/load balancer, and you are going
to use it for TLS termination (that's a fancy, but technically correct way
of saying "nginx will handle all this HTTPS stuff").
&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;
nginx serves several Web sites, and you want HTTPS on all of them, and
you are not going to pay a single dime.
&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;
You also want to get the highest grade on the industry standard for SSL
tests—&lt;a href="https://www.ssllabs.com/ssltest"&gt;SSL Lab's SSL server test&lt;/a&gt;.
&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;
You do not enjoy the idea of running some not-so-well-sandboxed
third-party code on your server, and you would rather have this code in a
Docker container.
&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;
Naturally, you are lazy (or experienced) enough, so you want to write
some scripts that will re-issue all certificates way before they expire.
&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-link field--type-ds field--label-hidden field--item"&gt;  &lt;a href="https://www.linuxjournal.com/content/lets-automate-lets-encrypt" hreflang="und"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Tue, 01 Nov 2016 10:08:36 +0000</pubDate>
    <dc:creator>Andrei Lukovenko</dc:creator>
    <guid isPermaLink="false">1339202 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>nginx</title>
  <link>https://www.linuxjournal.com/content/nginx</link>
  <description>  &lt;div data-history-node-id="1339168" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
      
            &lt;div class="field field--name-field-node-image field--type-image field--label-hidden field--item"&gt;  &lt;img src="https://www.linuxjournal.com/sites/default/files/nodeimage/story/12112778334_5b731027e7_z.jpg" width="608" height="423" alt="" typeof="foaf:Image" class="img-responsive" /&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-author field--type-ds field--label-hidden field--item"&gt;by &lt;a title="View user profile." href="https://www.linuxjournal.com/users/reuven-m-lerner" lang="" about="https://www.linuxjournal.com/users/reuven-m-lerner" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;Reuven M. Lerner&lt;/a&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"&gt;&lt;p&gt;
Engineers love to think that they make decisions based on pure
logic and merit. But of course, everyone has biases in terms of
programming languages, editors and other technologies—biases that
probably can be defended in technical terms, but that often come down to an
emotional argument as much as a technical one. (Except in the case of
Emacs, of course, which is &lt;em&gt;clearly&lt;/em&gt; the best editor by all objective
standards.) The problem with such biases is that they can cause people to
make choices and decisions that feel comfortable, but aren't
necessarily right.
&lt;/p&gt;

&lt;p&gt;
Case in point: I've been using the Apache HTTP server for many years
now. Indeed, you could say that I've been using Apache since before it
was even called "Apache"—what started as the original NCSA HTTP
server, and then the patched server that some enterprising open-source
developers distributed, and finally the Apache Foundation-backed
open-source colossus that everyone recognizes, and even relies on,
today—doing much more than just producing HTTP servers.
&lt;/p&gt;

&lt;p&gt;
Apache's genius was its modularity. You could, with minimal effort,
configure Apache to use a custom configuration of modules. If you
wanted to have a full-featured server with tons of debugging and
diagnostics, you could do that. If you wanted to have high-level
languages, such as Perl and Tcl, embedded inside your server for
high-speed Web applications, you could do that. If you needed the
ability to match, analyze and rewrite every part of an HTTP
transaction, you could do that, with &lt;code&gt;mod_rewrite&lt;/code&gt;. And of course,
there were third-party modules as well.
&lt;/p&gt;

&lt;p&gt;
Things got even better through the years as the Web got larger, and Web
sites were expected to do more and more. Scalability became an
important issue, and Apache handled it with (not surprisingly) a
variety of modules that implemented different back-end schemes. You
could have the traditional mix of processes, or use threads, or
combinations of the two.
&lt;/p&gt;

&lt;p&gt;
Beyond the flexibility, it was clear that Apache httpd was well
maintained, well documented and stable. Installation was easy,
upgrades were easy—really, everything was easy.
&lt;/p&gt;

&lt;p&gt;
So, it's no surprise that Apache always has been my first choice when
it comes to HTTP servers. And yet, I always knew in the back of my
mind that I really should spend more time checking out other options.
In particular, one alternative stood out—nginx.
&lt;/p&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-link field--type-ds field--label-hidden field--item"&gt;  &lt;a href="https://www.linuxjournal.com/content/nginx" hreflang="und"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Tue, 27 Sep 2016 13:30:00 +0000</pubDate>
    <dc:creator>Reuven M. Lerner</dc:creator>
    <guid isPermaLink="false">1339168 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>Analyzing Data</title>
  <link>https://www.linuxjournal.com/content/analyzing-data</link>
  <description>  &lt;div data-history-node-id="1339131" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
      
            &lt;div class="field field--name-field-node-image field--type-image field--label-hidden field--item"&gt;  &lt;img src="https://www.linuxjournal.com/sites/default/files/nodeimage/story/Python.png" width="480" height="480" alt="" typeof="foaf:Image" class="img-responsive" /&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-author field--type-ds field--label-hidden field--item"&gt;by &lt;a title="View user profile." href="https://www.linuxjournal.com/users/reuven-m-lerner" lang="" about="https://www.linuxjournal.com/users/reuven-m-lerner" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;Reuven M. Lerner&lt;/a&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"&gt;&lt;p&gt;
My first Web-related job was in 1995, developing Web applications for
a number of properties at Time Warner. When I first started there, we
had a handful of programmers and managers handling all of the
tasks. But over time, as happens in all growing companies and
organizations, we started to specialize. One of the developers took
charge of the logfiles—storing them and then performing some basic
analysis on them.
&lt;/p&gt;

&lt;p&gt;
Although I recognized that this work was important, it took years for me
to realize that in some ways, his job was more important to the
business than the applications that I was writing. The developer who
worked on these logfiles, and who analyzed them for our bosses, made
it possible to know who was using our system, what they were viewing
and using, where they came from, and what correlations we could find
among the different data points provided by the logs. Sure, we were
providing the content and the applications that brought people to the
site, but it was the person analyzing the logfiles who was ensuring
that our work was paying for itself and meeting our business goals.
&lt;/p&gt;

&lt;p&gt;
During the past decade, I've come to appreciate the need for such
analysis even more, as the Web has exploded in popularity, as
businesses have learned to use such data to increase profitability
and as data science has become a growing field. We're now drowning in
data, and being able to make sense of it using analytical tools and
libraries is more important than ever.
&lt;/p&gt;

&lt;p&gt;
In this article, I start an exploration of data science using Python,
and how you can take something as ordinary as an Apache logfile and
extract information from it to understand your visitors better and what
they do. In upcoming articles, I plan to cover how you can use data science
methods to analyze this logfile in a number of different ways, gaining
insights into the raw data it provides and answering questions
about your Web application. I'll describe how this analysis also
can be presented to your managers and clients, providing powerful
visualizations of the analysis you've performed.
&lt;/p&gt;

&lt;h3&gt;
Data Science and Python&lt;/h3&gt;

&lt;p&gt;
I studied something called "learning sciences" in graduate school.
While I was there, we often would joke that any discipline that
includes the word "science" in its name is probably not a real
science. Regardless of whether data science is a "real" science, it is
a large, important and growing field—one that allows businesses
to make decisions based on the data they have gathered. The more
data, and the more intelligently you use that data, the better you'll
be able to predict your users' and customers' wants and needs.
&lt;/p&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-link field--type-ds field--label-hidden field--item"&gt;  &lt;a href="https://www.linuxjournal.com/content/analyzing-data" hreflang="und"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Mon, 15 Aug 2016 15:30:00 +0000</pubDate>
    <dc:creator>Reuven M. Lerner</dc:creator>
    <guid isPermaLink="false">1339131 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>Client-Side Performance</title>
  <link>https://www.linuxjournal.com/content/client-side-performance</link>
  <description>  &lt;div data-history-node-id="1339099" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
      
            &lt;div class="field field--name-field-node-image field--type-image field--label-hidden field--item"&gt;  &lt;img src="https://www.linuxjournal.com/sites/default/files/nodeimage/story/icon-1423252_960_720.jpg" width="400" height="400" alt="" typeof="foaf:Image" class="img-responsive" /&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-author field--type-ds field--label-hidden field--item"&gt;by &lt;a title="View user profile." href="https://www.linuxjournal.com/users/reuven-m-lerner" lang="" about="https://www.linuxjournal.com/users/reuven-m-lerner" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;Reuven M. Lerner&lt;/a&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"&gt;&lt;p&gt;
In past articles, I've covered different ways to
understand, analyze and improve the performance of your web
applications. I've shown that between your network connections, server
hardware, database design and HTTP server configuration, you can
change and improve the performance of your web application—well, sort
of. Web applications, when they first started, were
dynamic only on the server side. Sure, they output HTML—and later, CSS
and JavaScript—but the overwhelming majority of the processing and
computation took place on the server.
&lt;/p&gt;

&lt;p&gt;
This model, of course, has changed dramatically in the last decade, to
such a degree that you now accurately can claim to be a web developer
and work almost exclusively in HTML, CSS and JavaScript, with little
or no server-side component. Entire MVC frameworks, such as Ember.js,
Angular.js and React.js, assume that you'll be writing your
application in JavaScript and provide you with the objects and
infrastructure necessary for doing so.
&lt;/p&gt;
&lt;p&gt;
If you're worried about the performance of your web application, you
need to concern yourself not only with what happens on the
server, but also with what happens in the browser. Some commercial
performance-monitoring solutions already take this into account,
allowing you to see how long it takes for elements to render, and then
to execute, on your users' browsers. However, there is also no
shortage of open-source tools available for you to check and improve
the ways in which your client-side programs are executing.
&lt;/p&gt;

&lt;p&gt;
This month, I'm concluding this exploration of web application
performance with a survey of things to keep in mind, as well as tools
that help ensure that you're actually doing what you should be.
&lt;/p&gt;

&lt;h3&gt;
Client-Side Considerations&lt;/h3&gt;

&lt;p&gt;
Client-side code is written in JavaScript. The code, whether inline in
&lt;script&gt; tags or retrieved from a remote server, executes whenever the
browser's parser gets to that part of the page. If you have
JavaScript at the top of the page, it'll be executed when the
parser gets to it, potentially delaying the rendering of the rest of
your page.
By contrast, if your JavaScript is at the bottom, the
parser will execute it only after parsing and rendering the
rest of the page. This is why so many developers learned to put their
JavaScript commands inside a "document-ready" callback function; in
that way, the code was executed only once the entire page had been
loaded.
&lt;/p&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-link field--type-ds field--label-hidden field--item"&gt;  &lt;a href="https://www.linuxjournal.com/content/client-side-performance" hreflang="und"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Thu, 30 Jun 2016 16:00:00 +0000</pubDate>
    <dc:creator>Reuven M. Lerner</dc:creator>
    <guid isPermaLink="false">1339099 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>Ben Rady's Serverless Single Page Apps (The Pragmatic Programmers)</title>
  <link>https://www.linuxjournal.com/content/ben-radys-serverless-single-page-apps-pragmatic-programmers</link>
  <description>  &lt;div data-history-node-id="1339053" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
      
            &lt;div class="field field--name-field-node-image field--type-image field--label-hidden field--item"&gt;  &lt;img src="https://www.linuxjournal.com/sites/default/files/nodeimage/story/12016f3.jpg" width="400" height="480" alt="" typeof="foaf:Image" class="img-responsive" /&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-author field--type-ds field--label-hidden field--item"&gt;by &lt;a title="View user profile." href="https://www.linuxjournal.com/users/james-gray" lang="" about="https://www.linuxjournal.com/users/james-gray" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;James Gray&lt;/a&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"&gt;&lt;img src="https://www.linuxjournal.com/files/linuxjournal.com/ufiles/imagecache/large-550px-centered/u1000009/12016f3.jpg" alt="" title="" class="imagecache-large-550px-centered" /&gt;&lt;p&gt;
You don't need to manage your own servers to build powerful Web
applications. Need proof? Pick up Ben Rady's new book &lt;em&gt;Serverless
Single Page Apps: Fast, Scalable, and Available&lt;/em&gt; (published by &lt;a href="https://pragprog.com"&gt;Pragmatic Programmers&lt;/a&gt;), a guide to creating single-page
apps that run entirely on Web services, scale to millions of users and cost
amazingly little. 
&lt;/p&gt;

&lt;p&gt;
Readers of Rady's book will skip over building an
application server, avoid messing around with middle-tier infrastructure and get
right to the Web app their customers want. Using a Web browser, a prepared
workspace and an editor, readers learn the fundamental technologies behind
modern single-page apps and use Web standards to create lean Web applications
that can take advantage of the newest technologies. 
&lt;/p&gt;

&lt;p&gt;
They'll also deploy the
application quickly using Amazon S3 and utilize Amazon Cognito to connect with
providers like Google and Facebook to manage user identities. Other topics
include DynamoDB for reading and writing user data directly from the browser and
Amazon Lambda for creation of scalable custom microservices. 
&lt;/p&gt;

&lt;p&gt;
&lt;em&gt;Serverless Single
Page Apps&lt;/em&gt; is for those who either have never built a Web application before and
seasoned Web developers looking for an alternative to complex server-side Web
frameworks. 
&lt;/p&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-link field--type-ds field--label-hidden field--item"&gt;  &lt;a href="https://www.linuxjournal.com/content/ben-radys-serverless-single-page-apps-pragmatic-programmers" hreflang="und"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Fri, 13 May 2016 14:00:00 +0000</pubDate>
    <dc:creator>James Gray</dc:creator>
    <guid isPermaLink="false">1339053 at https://www.linuxjournal.com</guid>
    </item>

  </channel>
</rss>
