1 COMMENT
JavaScript
James Hibbard, Feb 06

SitePoint 2017 JavaScript Survey — the Results Are In

The results of our 2017 JavaScript survey are in! James Hibbard takes a look at how you answered and addresses some of the comments raised.
PHP
Bruno Skvorc, Feb 06

Quick Tip: LetsEncrypt "server" error fix on Ubuntu 16.04

Running into the cryptic "server" error when renewing your server's HTTPS certificates with LetsEncrypt? Here's how to solve it.
Entrepreneur
M. David Green, Feb 06

Scrum Artifacts: Product Backlog

Stories for the development team emerge from the product owner's product backlog.
Entrepreneur
Abhishek Talreja, Feb 03

How Processes Overcome These Small Business Productivity Hurdles

Businesses without good process management leave a lot of money on the table. Here's how you can boost your small business productivity.
3 COMMENTs
HTML & CSS
Tiffany Brown, Feb 03

CSS Pseudo-classes: :not() and :target

Perhaps the most powerful of this new crop of pseudo-classes is :not(). It returns all elements except for those that match the selector argument.
Java
Nicolai Parlog, Feb 02

Java Module System Hands-On Guide

In this post we'll take an existing demo application and modularize it with Java 9. If you want to follow along, head over to GitHub, where all of the code can be found. The setup instructions are important to get the scripts running with Java 9. For brevity, I removed the prefix org.codefx.demo from all package, module, and folder names in this article.

The Application Before Jigsaw

Even though I do my best to ignore the whole Christmas kerfuffle, it seemed prudent to have the demo uphold the spirit of the season. So it models an advent calendar:
  • There is a calendar, which has 24 calendar sheets.
  • Each sheet knows its day of the month and contains a surprise.
  • The death march towards Christmas is symbolized by printing the sheets (and thus the surprises) to the console.
Of course the calendar needs to be created first. It can do that by itself but it needs a way to create surprises. To this end it gets handed a list of surprise factories. This is what the main method looks like:
public static void main(String[] args) {
	List<SurpriseFactory> surpriseFactories = Arrays.asList(
			new ChocolateFactory(),
			new QuoteFactory()
	);
	Calendar calendar =
		Calendar.createWithSurprises(surpriseFactories);
	System.out.println(calendar.asText());
}
The initial state of the project is by no means the best of what is possible before Jigsaw. Quite the contrary, it is a simplistic starting point. It consists of a single module (in the abstract sense, not the Jigsaw interpretation) that contains all required types:
  • "Surprise API" - Surprise and SurpriseFactory (both are interfaces)
  • "Calendar API" - Calendar and CalendarSheet to create the calendar
  • Surprises - a couple of Surprise and SurpriseFactory implementations
  • Main - to wire up and run the whole thing.
Compiling and running is straight forward (commands for Java 8):
# compile
javac -d classes/advent ${source files}
# package
jar -cfm jars/advent.jar ${manifest and compiled class files}
# run
java -jar jars/advent.jar

Entering Jigsaw Land

The next step is small but important. It changes nothing about the code or its organization but moves it into a Jigsaw module.

Modules

So what's a module? To quote the highly recommended State of the Module System:
A module is a named, self-describing collection of code and data. Its code is organized as a set of packages containing types, i.e., Java classes and interfaces; its data includes resources and other kinds of static information. To control how its code refers to types in other modules, a module declares which other modules it requires in order to be compiled and run. To control how code in other modules refers to types in its packages, a module declares which of those packages it exports.
(The last paragraph is actually from an old version of the document but I like how it summarizes dependencies and exports.) So compared to a JAR a module has a name that is recognized by the JVM, declares which other modules it depends on and defines which packages are part of its public API.

Name

A module's name can be arbitrary. But to ensure uniqueness it is recommended to stick with the inverse-URL naming schema of packages. So while this is not necessary it will often mean that the module name is a prefix of the packages it contains.

Dependencies

A module lists the other modules it depends on to compile and run. This is true for application and library modules but also for modules in the JDK itself, which was split up into about 100 of them (have a look at them with java --list-modules). Again from the design overview:
When one module depends directly upon another in the module graph then code in the first module will be able to refer to types in the second module. We therefore say that the first module reads the second or, equivalently, that the second module is readable by the first. [...] The module system ensures that every dependence is fulfilled by precisely one other module, that the module graph is acyclic, that every module reads at most one module defining a given package, and that modules defining identically-named packages do not interfere with each other.
When any of the properties is violated, the module system refuses to compile or launch the code. This is an immense improvement over the brittle classpath, where e.g. missing JARs would only be discovered at runtime, crashing the application. It is also worth to point out that a module is only able to access another's types if it directly depends on it. So if A depends on B, which depends on C, then A is unable to access C unless it requires it explicitly.

Exports

A module lists the packages it exports. Only public types in these packages are accessible from outside the module. This means that public is no longer really public. A public type in a non-exported package is as inaccessible to the outside world as a non-public type in an exported package. Which is even more inaccessible than package-private types are before Java 9 because the module system does not even allow reflective access to them. As Jigsaw is currently implemented command line flags are the only way around this.

Implementation

To be able to create a module, the project needs a module-info.java in its root source directory:
module advent {
    // no imports or exports
}
Wait, didn't I say that we have to declare dependencies on JDK modules as well? So why didn't we mention anything here? All Java code requires Object and that class, as well as the few others the demo uses, are part of the module java.base. So literally every Java module depends on java.base, which led the Jigsaw team to the decision to automatically require it. So we do not have to mention it explicitly. The biggest change is the script to compile and run (commands for Java 9):
# compile (include module-info.java)
javac -d classes/advent ${source files}
# package (add module-info.class and specify main class)
jar --create \
	--file=mods/advent.jar \
	--main-class=advent.Main \
	${compiled class files}
# run (specify a module path and simply name to module to run)
java --module-path mods --module advent
We can see that compilation is almost the same - we only need to include the new module-info.java in the list of classes. The jar command will create a so-called modular JAR, i.e. a JAR that contains a module. Unlike before we need no manifest anymore but can specify the main class directly. Note how the JAR is created in the directory mods. Utterly different is the way the application is started. The idea is to tell Java where to find the application modules (with --module-path mods, this is called the module path) and which module we would like to launch (with --module advent). jigsaw-demo-hands-on

Splitting Into Modules

Now it's time to really get to know Jigsaw and split that monolith up into separate modules.
Entrepreneur
Aleczander Gamboa, Feb 02

Meet the Top 3% Disrupting the Freelance Industry

Introducing Toptal - an elite talent agency that houses the top 3% of best software developers, UX/UI designers and finance experts the world has to offer.
9 COMMENTs
PHP
Christopher Pitt, Feb 02

How to Make Modern PHP More Modern? With Preprocessing!

Chris adds some unexpected functionality to PHP, and all without custom extensions or recompiling. Let's unlock the power of macros and preprocessors!
Web
Craig Buckler, Feb 02

Take the Pain Out of Form-Building with JotForm 4.0

Craig Buckler looks at JotForm 4.0, a tool that enables people without a technical background to build advanced, beautiful forms.
1 COMMENT
Design & UX
Kelsey Bryant, Feb 02

How Meella Accidentally Became a Full-Time Book Cover Designer

How do you break into the book cover design industry? Book designer Miladinka Milic shares her insights and how she stumbled into the industry by accident.
Entrepreneur
M. David Green, Feb 02

Scrum Artifacts: Stories

One of the most basic artifacts of scrum for web and mobile work is the story that describes a feature to be worked on.
8 COMMENTs
JavaScript
George Martsoukos, Feb 01

Animated Filtering & Sorting with the MixItUp 3 JS Library

George Martsoukos introduces MixItUp 3, a high-performance JavaScript library that allows you to animate filtering and sorting of page content.
1 COMMENT
Entrepreneur
Aleczander Gamboa, Feb 01

Turn Your Side Project into a Full-Time Gig: Tips from Hacking UI

Hacking UI and Side Project Accelerator Co-Founder David Tinter shares his top tips to turning your side project into a full-time gig.
Java
Nicolai Parlog, Feb 01

Java's Switch Statement in Three Minutes

Java's switch statement allows easy selection of execution paths based on a variable's value. Switches can replace if-else-if chains.
34 COMMENTs
Mobile
Valdio Veliu, Feb 01

Mastering Complex Lists with the Android RecyclerView

Valdio Veliu looks at the RecyclerView in Android, perfect for handling long lists of data efficiently.
Design & UX
John Stevens, Feb 01

6 Email Hacks Guaranteed to Boost Results from Your Email Efforts

According to the Direct Marketing Association, you can expect an ROI of $38 for every $1 you spend on email marketing. Small tweaks can be big money.
1 COMMENT
HTML & CSS
Louis Lazaris, Feb 01

More HTML5 Semantics: Changes to Existing Features

While new elements and APIs have been the primary focus of HTML5, this latest iteration of web markup has also brought with it changes to existing elements.
1 COMMENT
Design & UX
Kelsey Bryant, Jan 31

Kerry Ellis Shares Her Passion for Book Cover Design

What makes a good book cover designer, and how can you work with one? Kerry Ellis, one of 99designs' top designers, shares her advice.
Programming
Shaumik Daityari, Jan 31

How to Import Data and Export Results in R

Shaumik explains how to extract data from text files, CSV files and databases, and how to send that data to a web server.
7 COMMENTs
JavaScript
Tania Rascia, Jan 31

A Beginner's Guide to JavaScript Variables and Datatypes

Get a solid understanding of the language from first principles, as Tania Rascia explains the basics of JavaScript variables and datatypes.
HTML & CSS
Louis Lazaris, Jan 31

20+ Docs and Guides for Front-end Developers (No. 11)

Louis Lazaris is here with installment number 11 of his series on fantastic learning resources, docs and guides for front-end developers 
Mobile
Deivi Taka, Jan 31

Understanding iOS Proactive Suggestions

With the introduction of the “Proactive” feature in iOS 9, Apple is trying to proactively assist you. The system learns from your actions and attempts to anticipate them. It starts showing suggestions, recommendations, apps you frequently use, etc. The Handoff feature hasn’t changed but the space usually reserved for it in the lock screen is used for suggested apps. Apps shown in the bottom-left corner of the lock screen and in the app switcher are based on your location or habits. The following screenshots show quick access to the Music app when I plug in my headphones. iOS has noticed that when I plug in my headphones, I immediately go to the Music app, so it now gives me quicker access to it. The same will happen for an app that uses location. It will appear when you are near your favorite restaurant, for instance. Spotlight search can be reached from the home menu; by swiping down or by swiping all the way left. The first thing to notice are the Siri suggestions below the search bar. By default, you’ll see the 4 apps you are likely to use at that given time (of the day or night), but it can be expanded up to 8 apps. It also depends on your location, or on whether your headphones are plugged in. So Siri suggests apps depending on your previous behavior or on the time of the day. In the screenshot below on the left, Siri has suggested messaging apps and a game I currently play. Notice that in the screenshot on the right, the suggestions change as I plugged in my headphones. Just as in the previous example, the system is trying to help access the Music app quicker.
1 COMMENT
Java
Alejandro Gervasio, Jan 30

Using CDI/Weld to Inject JPA/Hibernate Entity Managers

A tutorial on how to use Contexts and Dependency Injection (CDI) / Weld and Hibernate in the development of a full-blown JPA application.
39 COMMENTs
JavaScript
Mark Brown, Jan 30

A Beginner's Guide to Webpack 2 and Module Bundling

In this beginner-friendly webpack 2 tutorial, Mark Brown demonstrates how to set up and configure webpack to transform and bundle all your front-end assets.