<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:og="http://ogp.me/ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:schema="http://schema.org/" xmlns:sioc="http://rdfs.org/sioc/ns#" xmlns:sioct="http://rdfs.org/sioc/types#" xmlns:skos="http://www.w3.org/2004/02/skos/core#" xmlns:xsd="http://www.w3.org/2001/XMLSchema#" version="2.0" xml:base="https://www.linuxjournal.com/">
  <channel>
    <title>Application Development</title>
    <link>https://www.linuxjournal.com/</link>
    <description/>
    <language>en</language>
    
    <item>
  <title>Organizing a Market for Applications</title>
  <link>https://www.linuxjournal.com/content/organizing-market-applications</link>
  <description>  &lt;div data-history-node-id="1340095" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&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/sriram-ramkrishna" lang="" about="https://www.linuxjournal.com/users/sriram-ramkrishna" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;Sriram Ramkrishna&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 "Year of the Desktop" has been a perennial call to arms that's sunken into a
joke that's way past its expiration date. We frequently talk about
the "Year of the Desktop", but we don't really talk about how we would
achieve that goal. What does the "Year of the Desktop" even look like?
&lt;/p&gt;

&lt;p&gt;
What it comes down to is applications—rather, a market for applications.
There is no market for applications because of a number of cultural
artifacts that began when the Free Software was just getting up on wobbly legs.
&lt;/p&gt;

&lt;p&gt;
Today, what we have is a distribution-centric model. Software is
distributed by an OSV (operating system vendor), and users get their software
directly from there via whatever packaging mechanism that OSV supports.
This model evolved, because in the early-to-mid 1990s, those OSVs existed to
compile the kernel and userspace into a cohesive product. Packaging of
applications was the next step as a convenience factor to save users from
having to compile their own applications, which always was a hit-or-miss
endeavor as developers
had different development environment from the users. Ultimately, OSVs
enjoyed being gatekeepers as part of keeping developers honest and fixing
issues that were unique to their operating system. OSVs saw themselves as
agents representing users to provide high-quality software, and there was a
feeling
that developers were not to be trusted, as of course, nobody knows the state
of their operating system better than they would.
&lt;/p&gt;

&lt;p&gt;
However, this model represented a number of challenges to both
commercial and open-source developers. For commercial developers, the
problem became how to maximize their audience as the "Linux"
market consisted of a number of major OSVs and an uncountable number of
smaller niche distributions. Commercial application developers would have
to develop multiple versions of their own application targeted at
various major distributions for fear of missing out on a subset of users.
Over time, commercial application developers would settle on using Ubuntu
or a compressed tar file hosted on their website. Various distributions would
pick up these tar balls and re-package them for their users. If
you were an open-source developer, you had the side benefit of distributions
picking up your work automatically for you and packaging them if you
successfully enjoyed a large following. But they faced the same dilemma.
&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/organizing-market-applications" hreflang="en"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Fri, 24 Aug 2018 13:08:08 +0000</pubDate>
    <dc:creator>Sriram Ramkrishna</dc:creator>
    <guid isPermaLink="false">1340095 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>Introducing PyInstaller</title>
  <link>https://www.linuxjournal.com/content/introducing-pyinstaller</link>
  <description>  &lt;div data-history-node-id="1339871" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&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;&lt;em&gt;Want to distribute Python programs to your Python-less clients?
PyInstaller is the answer.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;
If you're used to working with a compiled language, the notion
that you would need to have a programming language around, not just for
development but also for running an application, seems a bit weird.
Just because a program was written in C doesn't mean you need a C
compiler in order to run it, right?
&lt;/p&gt;

&lt;p&gt;
But of course, interpreted and byte-compiled languages do require
the original language, or a version of it, in order to run. True, Java
programs are compiled, but they're compiled into bytecodes then
executed by the JVM. Similarly, .NET programs cannot run unless the
CLR is present.
&lt;/p&gt;

&lt;p&gt;
Even so, many of the students in my Python courses are surprised to
discover that if you want to run a Python program, you need to have
the Python language installed. If you're running Linux, this
isn't a problem. Python has come with every distribution I've used
since 1995. Sometimes the Python version isn't as modern as I'd like,
but the notion of "this computer can't run Python programs" isn't
something I've had to deal with very often.
&lt;/p&gt;

&lt;p&gt;
However, not everyone runs Linux, and not everyone's computer has
Python on it. What can you do about that? More specifically, what
can you do when your clients don't have Python and aren't interested
in installing it? Or what if you just want to write and distribute an
application in Python, without bothering your users with additional
installation requirements?
&lt;/p&gt;

&lt;p&gt;
In this article, I discuss &lt;a href="https://pyinstaller.readthedocs.io"&gt;PyInstaller&lt;/a&gt;, a cross-platform tool that
lets you take a Python program and distribute it to your users,
such that they can treat it as a standalone app. I also discuss
what it doesn't do, because many people who think about using
PyInstaller don't fully understand what it does and doesn't
do.
&lt;/p&gt;


&lt;span class="h3-replacement"&gt;Running Python Code&lt;/span&gt;

&lt;p&gt;
Like Java and .NET, Python programs are compiled into bytecodes, high-level commands that don't correspond to the instructions
of any actual computer, but that reference something known as a
"virtual machine". There are a number of substantial differences
between Java and Python though. Python doesn't have an explicit
compilation phase; its bytecodes are pretty high level and connected
to the Python language itself, and the compiler doesn't do that much
in terms of optimization. The correspondence between Python source
code and the resulting bytecodes is basically one-to-one; you won't find
the bytecode compiler doing fancy things like inlining code or
optimizing loops.
&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/introducing-pyinstaller" hreflang="en"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Mon, 18 Jun 2018 11:30:00 +0000</pubDate>
    <dc:creator>Reuven M. Lerner</dc:creator>
    <guid isPermaLink="false">1339871 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>Developing Console Applications with Bash</title>
  <link>https://www.linuxjournal.com/content/developing-console-applications-bash</link>
  <description>  &lt;div data-history-node-id="1339880" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&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;
&lt;em&gt;Bring the power of the Linux command line into your
application development process.&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
As a novice software developer, the one thing I look for when choosing
a programming language is this: is there a library that allows me to interface
with the system to accomplish a task? If Python didn't have Flask, I
might choose a different language to write a web application. For this
same reason, I've begun to develop many, admittedly small, applications with
Bash. Although Python, for example, has many modules to import and extend
functionality, Bash has thousands of commands that perform a variety of
features, including string manipulation, mathematic computation, encryption
and database operations. In this article, I take a look at these features and how to
use them easily within a Bash application.
&lt;/p&gt;

&lt;span class="h3-replacement"&gt;
Reusable Code Snippets&lt;/span&gt;

&lt;p&gt;
Bash provides
three features that I've found particularly
useful when creating reusable functions: aliases, functions and command
substitution. An alias is a command-line shortcut for a long command.
Here's an example:

&lt;/p&gt;&lt;pre&gt;
&lt;code&gt;
alias getloadavg='cat /proc/loadavg'
&lt;/code&gt;
&lt;/pre&gt;


&lt;p&gt;
The alias for this example is &lt;code&gt;getloadavg&lt;/code&gt;. Once defined, it can be
executed as any other Linux command. In this instance,
&lt;code&gt;alias&lt;/code&gt; will dump the
contents of the /proc/loadavg file. Something to keep in mind is that this
is a static command alias. No matter how many times it is executed, it
always will dump the contents of the same file. If there is a need to vary the
way a command is executed (by passing arguments, for instance), you can
create a function. A function in Bash functions the same way as a function
in any other language: arguments are evaluated, and commands within the
function are executed. Here's an example function:

&lt;/p&gt;&lt;pre&gt;
&lt;code&gt;
getfilecontent() {
    if [ -f $1 ]; then
        cat $1
    else
        echo "usage: getfilecontent &lt;filename&gt;"
    fi
}
&lt;/code&gt;
&lt;/pre&gt;


&lt;p&gt;
This function declaration defines the function name as
&lt;code&gt;getfilecontent&lt;/code&gt;. The
&lt;code&gt;if&lt;/code&gt;/&lt;code&gt;else&lt;/code&gt; statement checks
whether the file specified as the first function
argument (&lt;code&gt;$1&lt;/code&gt;) exists. If it does, the contents of the file is outputted.
If not, usage text is displayed. Because of the incorporation of the
argument, the output of this function will vary based on the argument provided.
&lt;/p&gt;

&lt;p&gt;
The final feature I want to cover is command substitution. This is
a mechanism for reassigning output of a command. Because of the versatility
of this feature, let's take a look at two examples. This one
involves reassigning the output to a variable:

&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/developing-console-applications-bash" hreflang="en"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Mon, 07 May 2018 11:30:00 +0000</pubDate>
    <dc:creator>Andy Carlson</dc:creator>
    <guid isPermaLink="false">1339880 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>Creating an Application-Based Terminal Session</title>
  <link>https://www.linuxjournal.com/content/creating-application-based-terminal-session</link>
  <description>  &lt;div data-history-node-id="1339518" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&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;
One of my first exposures to computers in a work environment was using a Wyse
terminal to access a console-based application for data entry. It wasn't until a
while later that I learned about terminals in UNIX and how they work. Once I
understood it, I wanted to create my own self-contained application that was tied
to a telnet or SSH session.
&lt;/p&gt;

&lt;p&gt;
The method I've found to accomplish this involves the
use of the &lt;code&gt;trap&lt;/code&gt; command and some (seemingly) intimate loops. The example code will
be inserted into the .bashrc file of the user to whom you wish to give application access.
The example code was used for spam message entry into the sa-learn application for
Spam Assassin:

&lt;/p&gt;&lt;pre&gt;
&lt;code&gt;
instanceid="$RANDOM"
clean_session() {
    [[ -f /tmp/spam.message-$instanceid ]] &amp;&amp; rm /tmp/spam.message-$instanceid
    exit
}


trap clean_session SIGINT

while true; do
    clear
    printf "******** Spam Message Entry Menu ********\n"
    printf "Enter the body of spam message, then press Ctrl-D\n"
    printf "To exit at any time, press Ctrl-C\n\n"
    cat &gt; /tmp/spam.message-$instanceid
    clear
    printf "Processing....\n\n"
    /opt/bin/sa-learn --spam /tmp/spam.message-$instanceid
    printf "\n\n"
    rm /tmp/spam.message-$instanceid
    read -s -n 1 -p "Press any key to continue...."
done
exit
&lt;/code&gt;
&lt;/pre&gt;


&lt;p&gt;
Let's examine the logic and functionality. The first line establishes a unique
session ID for application access. If you have multiple users logging on with the
same user name this will help keep data straight between sessions. The
&lt;code&gt;clean_session&lt;/code&gt; function needs to be declared at the beginning of the script for use with the
following &lt;code&gt;trap&lt;/code&gt; statement. The &lt;code&gt;trap&lt;/code&gt; statement will run the
&lt;code&gt;clean_session&lt;/code&gt; function
whenever it detects that the user entered Ctrl-C (interrupt signal or SIGINT).
&lt;/p&gt;

&lt;p&gt;
For the purpose of establishing a the data-entry application, you'll use an infinite
&lt;code&gt;while&lt;/code&gt; loop. Once data is entered the first time and the end of the loop is reached,
the loop just starts over and is ready for more data entry. This is where the
&lt;code&gt;clean_session&lt;/code&gt; function comes into play. If users want to exit, as per the
instructional printouts, they type Ctrl-C. Normally, this would drop them into a
shell, but since you want to isolate their usage to this application, you'll invoke
the &lt;code&gt;clean_session&lt;/code&gt; function, which will clean up their temporary file (if it exists)
and log them off. The body of the &lt;code&gt;while&lt;/code&gt; loop just accepts input (the
&lt;code&gt;cat&lt;/code&gt; statement),
feeds the data into sa-learn and cleans up the temporary file.
&lt;/p&gt;

&lt;p&gt;
For this example, you will need to modify the sudoers file to allow your user root
access to sa-learn; the actual location of sa-learn might vary with your
installation.
&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/creating-application-based-terminal-session" hreflang="und"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Thu, 12 Oct 2017 15:11:28 +0000</pubDate>
    <dc:creator>Andy Carlson</dc:creator>
    <guid isPermaLink="false">1339518 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>LinkedIn's {py}gradle</title>
  <link>https://www.linuxjournal.com/content/linkedins-pygradle</link>
  <description>  &lt;div data-history-node-id="1339181" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&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;
To facilitate better building of Android apps, the technical team at
LinkedIn has developed {py}gradle, a new powerful, flexible and reusable
Python packaging system. Now available to the Open Source community,
{py}gradle wraps Python code into the Gradle build automation tool so that
developers can build Android apps more easily. The tool currently is used
for all Android projects at LinkedIn, and the company expects it to be
widely used in the Open Source community as well.
&lt;/p&gt;

&lt;p&gt;
With {py}gradle,
LinkedIn has bridged a gap between two similar but different technologies:
Setuptools and Gradle. LinkedIn says that Python's Setuptools works
well for self-contained Python applications with a small set of external
dependencies. However, Setuptools can become problematic in certain
situations as an organization's Python footprint grows, which led
LinkedIn to integrate Gradle and a plugin architecture. For each
language or technology stack, one simply needs to apply the build plugin
for the underlying language or technology stack. With Gradle, LinkedIn was
careful to enhance rather than replace the existing and idiomatic Python
package management ecosystem.
&lt;/p&gt;
&lt;img src="http://www.linuxjournal.com/files/linuxjournal.com/ufiles/imagecache/large-550px-centered/u1000009/12078f1.jpg" alt="" title="" class="imagecache-large-550px-centered" /&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/linkedins-pygradle" hreflang="und"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Mon, 10 Oct 2016 13:00:00 +0000</pubDate>
    <dc:creator>James Gray</dc:creator>
    <guid isPermaLink="false">1339181 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>Synopsys' Coverity</title>
  <link>https://www.linuxjournal.com/content/synopsys-coverity</link>
  <description>  &lt;div data-history-node-id="1339162" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&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;
The new version 8.5 of &lt;a href="http://synopsys.com"&gt;Synopsys&lt;/a&gt;' Coverity extends the security umbrella
of the static analysis tool to mitigate a wider range of security
vulnerabilities. Coverity, a core component of Synopsys' Software
Integrity Platform, is an automated software testing tool that analyzes
source code to detect critical security vulnerabilities and defects early
in the software development lifecycle. Coverity 8.5 adds static analysis
capabilities for Ruby and node.js web applications, as well as Android
mobile applications. In addition, version 8.5 expands security analysis to
address a wider range of security vulnerabilities and adds complete support
for MISRA C 2012 coding guidelines used in medical device, automotive and
other safety-critical industries. 
&lt;/p&gt;
&lt;img src="http://www.linuxjournal.com/files/linuxjournal.com/ufiles/imagecache/medium-350px-centered/u1000009/12060f4.jpg" alt="" title="" class="imagecache-medium-350px-centered" /&gt;&lt;p&gt;
This version of Coverity is ISO 26262-certified, demonstrating Synopsys' efforts to address vehicle security
and safety in the midst of emerging industry trends, such as connected cars
and autonomous driving. To support its growing customer base and expand its
software integrity business in the Asia Pacific region, Synopsys now offers
a localized version of Coverity 8.5 in simplified Chinese, including a
localized user interface, reporting, IDE plugins and documentation.
&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/synopsys-coverity" hreflang="und"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Tue, 20 Sep 2016 16:11:11 +0000</pubDate>
    <dc:creator>James Gray</dc:creator>
    <guid isPermaLink="false">1339162 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>Contrast Security's Contrast Enterprise</title>
  <link>https://www.linuxjournal.com/content/contrast-securitys-contrast-enterprise-0</link>
  <description>  &lt;div data-history-node-id="1339144" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&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;
The phrase with which &lt;a href="http://contrastsecurity.com"&gt;Contrast Security&lt;/a&gt; describes the one-of-a-kind
protection provided by the new Contrast Enterprise is "continuous
application security". By this, Contrast Security means that Contrast
Enterprise is "The first and only enterprise security software product
that fully integrates the ability to find and fix application
vulnerabilities during development, and monitor and block application
attacks in production, all within one unified environment." Contrast
Security points out that these two capabilities heretofore were
available only in partially integrated solutions at best or siloed products from
partnering vendors at worst. 
&lt;/p&gt;

&lt;img src="http://www.linuxjournal.com/files/linuxjournal.com/ufiles/imagecache/medium-350px-centered/u1000009/12049f5.jpg" alt="" title="" class="imagecache-medium-350px-centered" /&gt;&lt;p&gt;
Meanwhile, Contrast Enterprise uses patented
deep security instrumentation to weave vulnerability
detection, threat visibility and attack protection directly into
applications automatically, without requiring application changes or security experts.
While these applications are running, highly accurate context is instantly
generated about where applications are vulnerable and under attack.
Contrast Security calls its approach "a revolution in application
security for traditional development approaches, as well as for Agile
and DevOps methodologies".
&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/contrast-securitys-contrast-enterprise-0" hreflang="und"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Tue, 30 Aug 2016 13:30:00 +0000</pubDate>
    <dc:creator>James Gray</dc:creator>
    <guid isPermaLink="false">1339144 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-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;span class="h3-replacement"&gt;
Client-Side Considerations&lt;/span&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>Chris Birchall's Re-Engineering Legacy Software (Manning Publications)</title>
  <link>https://www.linuxjournal.com/content/chris-birchalls-re-engineering-legacy-software-manning-publications</link>
  <description>  &lt;div data-history-node-id="1339065" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&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="http://www.linuxjournal.com/files/linuxjournal.com/ufiles/imagecache/large-550px-centered/u1000009/12016f8.jpg" alt="" title="" class="imagecache-large-550px-centered" /&gt;&lt;p&gt;
Chances are high that you didn't write the application you're currently working
on. Most developers inherit projects built on an existing codebase that reflects
design patterns, usage assumptions, infrastructure and tooling from another
time and another team (and the docs are complete rubbish). To help you breathe
new life into your legacy project, pick up Chris Birchall's new book from &lt;a href="http://manning.com"&gt;Manning Publications&lt;/a&gt; titled
&lt;em&gt;Re-Engineering Legacy Software&lt;/em&gt;. Birchall's book is an experience-driven
guide to revitalizing inherited projects, covering refactoring, quality metrics,
toolchain and workflow, continuous integration, infrastructure automation and
organizational culture. On the purely technical side, readers will learn
techniques for introducing dependency injection for code modularity,
quantitatively measuring quality and automating infrastructure. On the
strategic side, readers will develop practical processes for deciding whether to
rewrite or refactor, team organization and even convincing management that
quality matters. Core topics include deciphering and modularizing awkward code
structures, effectively integrating and automating tests, replacing an outdated
build system and infrastructure automation using tools like Vagrant and
Ansible.
&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/chris-birchalls-re-engineering-legacy-software-manning-publications" hreflang="und"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Thu, 26 May 2016 16:30:00 +0000</pubDate>
    <dc:creator>James Gray</dc:creator>
    <guid isPermaLink="false">1339065 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-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="http://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="http://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>
