Showing posts with label PHP. Show all posts
Showing posts with label PHP. Show all posts

Tuesday, December 31, 2013

Significant Software Development Developments of 2013

At the end of each calendar year, I like to summarize some of the most significant developments in the software development industry that happened during the year that is ending. The choice of these is entirely subjective and obviously colored by my own experience, background, perceptions, and preferences. Not worrying about the opinionated content of such a post, I now present the developments in software development that I consider most significant in 2013.

10. Gradle

Gradle appeared to me to enter the mainstream consciousness of software developers in a big way in 2013. I have been watching Gradle's development and playing with it a bit for some time now, but I have noticed that numerous open source projects now mention it prominently, it's referenced in many recently published Java books that aren't even about Gradle specifically, and Google selected Gradle to be delivered with its Android Studio product announced at Google I/O 2013. It took a while for Maven to breakthrough and compete with Ant and I think 2013 is seeing the beginning of Gradle's breakthrough to challenge Maven and Ant for predominance in Java-based build systems. Three books devoted to Gradle (the short Gradle: Beyond the Basics, the more comprehensive Gradle in Action, and the German Gradle: Modernes Build-Management - Grundlagen und Praxiseinsatz) have listed 2013 publication dates.

Gradle's rapidly rising popularity is nearly matched by its torrid rate of new releases. Gradle 1.4 ("faster builds that use less heap space"), Gradle 1.5 ("optimizations to dependency resolution"), Gradle 1.6 (improved Task ordering, "JaCoCo plugin for test coverage," and support for JUnit test categories), Gradle 1.7 ("fastest Gradle ever"), Gradle 1.8 (performance improvements and more native languages support), Gradle 1.9 (bug fixes and HTML dependency report), and Gradle 1.10 ("command-line usability features") were all released in 2013.

Gradle's success does not surprise me. It's Groovy foundation alone offers numerous advantages: Groovy scripts are easier to write procedural build-style code than is XML, Groovy has numerous syntactic shortcuts, Groovy is easily learned and applied by Java developers, Groovy has full JVM access, and Groovy includes built-in Ant support. On top of its inherent advantages from being built on Groovy, Gradle builds many useful and attractive features of its own on top of that Groovy foundation. Gradle adheres to several Ant and Maven conventions and supports Ivy and Maven repositories, making it straightforward to move from Maven or Ant+Ivy to Gradle.

Ruby on Rails helped bring Ruby into mainstream international prominence and, to a lesser degree, Grails helped do the same thing for Groovy. Gradle has the potential to pick up where Grails left off and push Groovy even further into the spotlight.

9. Trend Toward Single Language Development

For several years now, there has been a definite trend toward polyglot programming (polyglot persistence was even on last year's version of this post). Although this trend is likely to continue because some languages are better for scripting than others, some languages are better suited for web development than others, some languages are better suited for desktop development than others, some languages are better suited for realtime and embedded device development than others, some languages are better suited for scientific computing than others, and so on. However, I have seen indications of the pendulum swinging back at least a bit recently.

One of the arguments in favor of Node.js is the ability for JavaScript developers to use the same language on the "front-end" of a web application as on the "back-end." In the post Top Things I learned about development in 2013, Antonin Januska writes, "Working back to front in the same language is awesome." This is, of course, the reason that Java developers have in some cases been resistant to using JavaScript, Flex, or JavaFX Script (now deprecated) for front-ends of their Java applications (and why tools like Google Web Toolkit have been so popular). Java developers who write desktop applications (yes Virginia, desktop applications do exist) often experience the advantages of using the same language front-to-back as well.

One of Ceylon's most promising possibilities is the ability to write code in Ceylon that works on both Java Virtual Machines and JavaScript virtual machines and so could be used front-to-back in a Ceylon-based application. Indeed, the Ceylon page advertises, "[Ceylon] runs on both Java and JavaScript virtual machines, bridging the gap between client and server." Languages commonly associated with the Java Virtual Machine such as Scala and Kotlin also are offering the ability to compile to JavaScript.

A final example of the trend back to a single language in many environments is the use of Python in scientific computing as covered in the post The homogenization of scientific computing, or why Python is steadily eating other languages’ lunch.

I'm not arguing that this trend means that there will only be one main programming language in the future. However, I do believe it is generally human nature to want to use the same language or approach as much as possible because it's what we're familiar with and using the same language helps us to leverage our experience more broadly in the same application. The trend seems to be for each of the major languages (C/C++, Java, JavaScript, Python, .NET languages, etc.) to continue building up their own "stack" to support end-to-end functionality within that language and its ecosystem of frameworks, libraries, and tools. It's no coincidence that once a new language starts to see significant adoption, it quickly begins to see development of a variety of frameworks, libraries, and toolkits that extend the reach of that language.

I also don't want to imply that this is the end of polyglot programming. I don't see any programming language that is the best fit in all cases and there is no doubt that the most valuable developers will be those familiar with more than one programming language.

8. Internet of Things

I first heard about the concept of the Internet of Things at JavaOne 2012 and it got even more attention at JavaOne 2013. Oracle is not the only company touting the Internet of Things. IBM is into the Internet of Things as are many others.

Some believe that 2014 will be the year of the Internet of Things. Tori Wieldt has called "Java and the Internet of Things" one of the "Top Java Stories of 2013." In 2013, two series in Hinkmond Wong's Weblog have focused on the Internet of Things with featured posts on a Thanksgiving Turkey Tweeter and on a Christmas Santa Detector.

Other useful articles with differing opinions on the Internet of Things include The Internet of Things: a tangled web, Here's the Scariest Part of the Internet of Things, The Internet Of Things Will Be Huge—Just Not As Huge As The Hype, Five Challenges For The Internet of Things Ecosystem, The Internet of things will not arrive in 2014, CES 2013: The Break-Out Year For The Internet Of Things, and Here's Why 'The Internet Of Things' Will Be Huge, And Drive Tremendous Value For People And Businesses.

On a lighter (or more dire, depending on your perspective) note related to The Internet of Things, Aaron Pressman writes, "The whole crazy 'Internet of Things' movement to put everything under network control seems tailor made for Hal" (2001: A Space Odyssey).

7. Mobile Development

If someone not familiar with our industry was to start reading our software development social media sites and forums, that person would likely come to the conclusion that the vast majority of software development today is development of mobile applications. I have long argued that blog posts and articles often skew toward more leading-edge topics than established topics for a variety of reasons (perception/reality that established topics are already well-covered, resume building, fun to play with and write about new things, etc.). That being stated, there is no question that mobile development is popular in reality and not just in perception. There is no question that a big part of HTML5's popularity and rapid adoption is the opportunity to write applications in one set of languages (HTML/JavaScript/CSS) that will run on multiple mobile devices. Numerous projects and tools are being released to allow for writing applications in one language and compiling them to native formats for various mobile devices.

6. Responsive Design

At the end of 2012, Pete Cashmore predicted that 2013 would be the "Year of Responsive Web Design" because of its "obvious benefits": "You build a website once, and it works seamlessly across thousands of different screens." I like Jordan Larkin's explanation of responsive web design:

The term "responsive web design" (or responsive mobile design) refers to websites that change and adapt their appearance for optimum viewing on all screen sizes, tablets, smartphones, ipods, kindles along with desktop and laptop computer screens. Occasionally, in the digital arts industry, it is called "fluid design", "adaptive website design" or "RWD". Unresponsive websites do not change to fit different screen sizes, which means they can be difficult to navigate and look at on smaller devices.

As a person who is using a smartphone for an increasing percentage of my daily online activities, but still uses the laptop frequently and the desktop occasionally, I am appreciating firsthand the web site authors whose web sites and pages work well on all of these devices. It's often satisfactory to have two different web sites (one for mobile devices and one for everything else) from a consumer point of view, but this obviously means essentially duplicate code for the site developers. Even from a consumer point of view, there are times when I find the mobile version of a site lacking in features and in those cases it'd be preferable to have the regular site on all devices as long as that regular site appeared nicely on all devices.

The highly informative web site A List Apart has a nice set of articles related to responsive web design.

5. Node.js

JavaScript, despite its flaws, has dominated the web browser for years. Although JavaScript on the server has been available for some time (such as with Rhino and more recently Nashorn in Java), Node.js seems to be doing for JavaScript on the server what Ruby on Rails did for Ruby: the framework is popularizing the language (or in this case, popularizing the language specifically on the server).

2013 has been a big year for Node.js. There are numerous blogs and articles written on it on seemingly a daily basis. Some of these articles include What You Need To Know About Node.js and Node.js keeps stealing Rails' thunder.

Several books on Node.js have been published in 2013. These include Node.js in Action, Learning Node.js: A Hands-On Guide to Building Web Applications in JavaScript, Node.js the Right Way: Practical, Server-Side JavaScript That Scales, Pro Node.js for Developers, Node.js Recipes: A Problem-Solution Approach, Mastering Node.js, Using Node.js for UI Testing, JavaScript on the Server Using Node.js and Express, and the final version of The Node Beginner Book.

4. Big Data

Big Data holds the same #4 spot on my list as it did last year. Apache Hadoop and the R Project are just two examples of popular products/languages riding the Big Data wave. Python too, is increasingly being chosen as the programming language of choice for working with big data sets.

Readers of java.net recently answered a survey regarding Big Data in which the closest thing to a consensus seemed to be that "Big Data Is Probably Significant, but not too Surprising."

3. HTML5

HTML5 saw initial hype, disappointed for a while, and seems to be back on its rapid rise in popularity. I don't call out JavaScript individually in this post, but group it with HTML and CSS as part of HTML5 (and its also grouped with Node.js in this post). Given that HTML5, for purposes of this blog post, represents all of these things, it easily makes my top three significant software development developments in 2013. As mentioned previously with regard to mobile development, HTML5 is a popular approach for generating applications once that can theoretically run on any mobile device.

HTML5 features are seeing increasing standardization in terms of implementations in major browser. JavaScript/HTML libraries such as Angular.js and Ember.js are building on the momentum that jQuery has brought to HTML5 development in recent years.

HTML5's success is even evident in languages not considered part of HTML5 themselves. For example, one of the most heavily advertised new features of Java EE 7 is its HTML5 support. Recent versions of NetBeans IDE (considered primarily a Java IDE despite its multiple language support) have also seemed to emphasize HTML5 among their most important new features in 2013.

2. Security

As more information is online and we depend increasingly on availability of our data online, security continues to be an important issue for software developers. The trend of highly visibility security incidents continued in 2013. These incidents affected Ruby on Rails, Java, and other languages. The increasing frequency of security patches led Oracle to change how it labels the versions of Java SE.

An early 2013 article, Safeguard your code: 17 security tips for developers, outlines tips developers can take to improve the security of their applications. An earlier article in 2013 spelled out the increasing security concerns companies face. The book Java Coding Guidelines: 75 Recommendations for Reliable and Secure Programs has also been published in 2013. The 10 Biggest Security Stories Of 2013 outlines some of the biggest security-related stories of 2013.

1. Technical Dysfunction

Sadly, from a software development perspective, 2013 may be most remembered for the high profile technical glitches that occurred. Words like "debacle," "disaster," and "meltdown" have been associated with these issues and, rightly or wrongly, have reflected poorly on our industry. The most high profile dysfunction has been the embarrassing United States healthcare site healthcare.org. However, the issues that affect reputations and customer confidence have not been limited to government. Wal-Mart and Target, two major retailers in the United States, have had notable web site issues in the latter part of 2013 as well. Cloud-impacting technical dysfunction has occurred in 2013 in several notable cases including Amazon Web Services (AWS) and Google (including the search engine).

There seems to be plenty of blame to go around, but it seems difficult to get a good read on exactly what has caused these high profile technical failures. With healthcare.org, for example, I've seen people blame all types of different culprits including not allotting enough time to the effort, not being agile enough, being too agile, failing for despite agile approaches, failing to estimate user load correctly, getting government involved, etc. Although the real reasons are probably multiple and varied in nature and probably interest software developers more than others, the perception of our industry has gotten dinged up in 2013.

Honorable Mention

Although the developments in software development listed below did not make my top ten, they are significant enough to me to make this "Honorable Mention" category (in no particular or implied order).

JSON

One of the benefits of XML many years now has been the ubiquity of XML support across different languages, tools, frameworks, and libraries. For example, I recently wrote about how easy it is to use Groovy to search Subversion logs because Subversion makes its log output available in XML format and Groovy knows XML well.

JSON has been very popular with developers for some time now, but there have been many cases where standard libraries and tools that supported XML did not support JSON, meaning that developers had to write custom writing/reading code for JSON when using those libraries and tools. I'm beginning to see a lot more JSON support with tools and libraries now. Programming languages are also providing nice JSON parsing/writing capabilities. For example, Groovy has had JSON support for some time and Java EE 7 (JAX-RS 2.0) includes JSON support via the Java API for JSON.

JSON has been prominent enough in 2013 to warrant being included in titles of two Packt Publishing books published in 2013: JavaScript and JSON Essentials and Developing RESTful Services with JAX-RS 2.0, WebSockets, and JSON.

Java EE 7 Released

Java EE 7 was officially released in 2013. In a testament to Java EE's current widespread use and expected potential use of Java EE 7, book publishers have already published several books on Java EE 7 including Java EE 7 First Look, Java EE 7 Essentials, Beginning Java EE 7, Java EE 7 Recipes: A Problem-Solution Approach, Introducing Java EE 7: A Look at What's New, and Java EE 7 Developer Handbook.

Although I've never embraced JavaServer Faces (JSF), the feature of Java EE 7 that has been most interesting to me is the support for Faces Flows. I first read about this feature when reviewing Java EE 7 First Look and Neil Griffin's post Three Cheers for JSF 2.2 Faces Flows have reinforced my interest in this feature. In the post A Realistic JSF 2.2 Faces Flows Example, Reza Rahman supports my opinion that this is a key feature in Java EE 7 to watch with the quote, "Faces Flows are one of the best hidden gems in Java EE 7." Michael and Faces Flows might persuade me to give JavaServer Faces another look.

A recent blog post shows integration of AngularJS with Java EE 7.

Single Page Applications

The advantage of web applications over desktop applications has always been significant easier deployment of web applications than of desktop applications. The cost, however, has been a less fluid experience and sometimes less performing application than could be provided on the desktop. The concept of single-page applications is to make web (and by extension mobile applications that use traditional web technologies) feel and behave more like a "single-page" desktop application. Newer JavaScript libraries such as Meteor are being designed for the "thicker client" style of single-page applications.

The Wikipedia page on Single Page Application lists some technical approaches to implementing this concept. The Manning book Single Page Web Applications was also released in 2013. It's subtitle is "JavaScript end-to-end" (another piece of evidence of the general movement toward a single language).

See the description of Meteor below for another nice explanation of how web development is moving toward what is essentially this concept of single-page applications.

AngularJS

It seems like one cannot read any software development social media sites without running across mention of AngularJS. Although its Google roots are undoubtedly part of its success, AngularJS enjoys success from cleanly addressing significant needs in HTML/JavaScript development (shifting appropriate dynamic functionality from pure JavaScript to HTML with clever binding). In his post 10 Reasons Why You Should Use AngularJS, Dmitri Lau states that "Angular is the only framework that doesn’t make MVC seem like putting lipstick on a pig." Jesus Rodriguez, in his post Why Does Angular.js Rock?, writes that AngularJS "excels in the creation of single-page-applications or even for adding some 'magic' to our classic web applications." K. Scott Allen writes in his post Why Use AngularJS?, "I like Angular because I have fun writing code on top of the framework, and the framework doesn't get in the way."

Ember.js

Ember.js is another JavaScript library seeing significant online coverage in 2013. Ember 1.0 was released on 31 August 2013 and Ember 1.2.0 was released on 4 December 2013.

Like AngularJS and Knockout, Ember.js's approach is to embrace HTML and CSS rather than trying to abstract them away.

Famo.us

The famo.us web page currently requires one to "sign up for the beta" before being able to "experience famo.us." It's subtitle is "a JavaScript engine and framework that solve HTML5 performance." Another famo.us page states, "famo.us is a front end framework that solves performance for HTML5 apps" and "works for phones, tablets, computers and television."

Famo.us is discussed in two late 2013 InfoWorld posts: Did these guys just reinvent the Web? and Fast and flashy: Famo.us JavaScript framework revealed.

At this point, famo.us is still in beta, but it could be big in 2014 if it is able to deliver on what is advertised in 2013.

Meteor

Meteor is described on its main page as "an open source platform" for writing "an entire app in pure JavaScript" and using the "same APIs ... on the client and the server." In the Paul Krill interview Meteor aims to make JavaScript programming fun again, Matt DeBergalis stated that Meteor was created to address the changing web development paradigm often referred to as single-page application:

There is a shift in the Web application platform, and specifically, people are starting to write a new kind of application, what we call a thick client, where most of the code is actually running inside the Web browser itself rather than in a data center. This is an architectural change from running the software in the data center and sending HTML on the wire to a model where we have data on the wire and the actual rendering, the displaying of the user interface, is happening on the client. ... That's why it feels more interactive. It's not page-based like the old Web. It's much more engaging."
MEAN Stack

Having a witty acronym helped advertise and communicate the LAMP stack (Linux, Apache HTTP Server, MySQL/MariaDB, PHP/Perl/Python) and arguably contributed to the adoption of this combination of technologies. With this in mind, I found Valeri Karpov's post The MEAN Stack: MongoDB, ExpressJS, AngularJS and Node.js interesting. The post's author is another who points out the productivity advantages that can be gained from using a single language throughout an application. There is already a book underway: Getting MEAN with Mongo, Express, Angular, and Node. It will be interesting to watch this newly minted terminology and see if the stack and its name come close to the success that the LAMP stack and its name have enjoyed.

Commercial Support Dropped for GlassFish 4

Although it took longer to happen than most people probably anticipated, Oracle's dropping of commercial support for GlassFish 4 was formally announced in 2013 and is what most of us expected when we heard of Oracle purchasing Sun. The future of GlassFish is certainly cloudier now and expectations for GlassFish's future range from it being essentially dead to it thriving as the reference implementation.

Java IDEs

The major Java IDEs continued to add features to their already impressive feature sets in 2013. NetBeans had two major releases in 2013 with 7.3 released in February and 7.4 released in October. These two NetBeans releases added features such as Java EE 7 support, Project Easel for HTML5 development, Groovy 2.0 integration, JSON support, support for new JavaScript libraries (including Angular.js), native Java application packaging, Cordova integration, and improved support for non-JVM languages C/C++ and PHP.

IntelliJ IDEA 13 was released earlier this month. The release announcement highlights support for Java EE 7, improved Spring Framework integration, improved Android support thanks to IntelliJ IDEA Community Edition being used as the basis for Android Studio, improved database handling, and "refined Gradle support." Eclipse is often the IDE chosen for building a more specialized IDE such as Spring IDE (Spring Tool Suite), Scala IDE, or the new Ceylon IDE, so it's a particularly big deal that Google chose IntelliJ IDEA as the basis of its Android Studio.

Speaking of Eclipse, the seemingly most used Java-based IDE (especially when you consider the IDEs derived from it or based on it) also saw new releases in 2013. Eclipse 4.3 (Kepler) was released in 2013. There were also numerous popular plugins for Eclipse released in 2013.

Visual Studio 2013

Sun Microsystems was not the only company that saw desirable advantages and benefits from a single language that could be used at all layers of an application. Microsoft has implemented various efforts (Silverlight) for years to do the same thing. In 2013, Visual Studio 2013 was released with significant enhancements. These enhancements included improved support for languages not specific to Microsoft's .NET framework. Many of these better supported languages are on my list in this post: JavaScript, HTML, CSS, and Python.

Groovy

Groovy's 2.0 release (including static compilation support) made 2012 a big year for Groovy. Although 2013 did not see as significant of enhancements in the Groovy language, the year did start out with the announcement of Groovy 2.1. Perhaps the biggest part of that 2.1 release was Groovy's full incorporation of Java SE 7's invokedynamic, a major Java SE enhancement intended for non-Java languages like Groovy.

Groovy 2.2's release was announced toward the end of 2013. This release improved Groovy's invokedynamic support by adding OSGi manifests to the Groovy's invokedynamic-based JARs.

In The Groovy Conundrum, Andrew Binstock writes that "with the performance issues behind it, Groovy is a language primed for widespread use," but warns that Groovy is a language that is "easy to learn, but hard to master."

As is mentioned more than once in this post, Groovy has had a lot of additional exposure in 2013 thanks to Gradle's rapidly rising popularity. I believe that Gradle will continue to introduce Groovy to developers not familiar with Groovy or will motivate developers who have not looked at Groovy for some time to look at it again.

Scala

It seems to me that Scala continues to gain popularity among Java developers. I continue to see Scala enthusiasts gushing about Scala on various Java and JVM blog comments and forums. One piece of evidence of Scala's continuing and increasing popularity is the number of new books published in 2013 with Scala in their title. These include Scala in Action, Scala Cookbook: Recipes for Object-Oriented and Functional Programming, Functional Programming Patterns in Scala and Clojure: Write Lean Programs for the JVM, Scala Design Patterns: Patterns for Practical Reuse and Design, Play for Scala, Scala Object-Oriented Programming, and Getting Started with SBT for Scala.

For a much better background on what made 2013 a big year for Scala, see Jan Machacek's This Year in Scala (2013).

Ceylon

November 2013 saw "the first production release of the Ceylon language specification, compiler, and IDE." This announcement, available online at Ceylon 1.0.0 is now available, also states, "Ceylon 1.0 is a modern, modular, statically typed programming language for the Java and JavaScript virtual machines." Ceylon offers an Elipse-based IDE and has a formal specification. One of the factors favoring a successful future for Ceylon is its Red Hat sponsorship.

Kotlin

Kotlin is another language that compiles to the Java Virtual Machine or to a JavaScript virtual machine. It also has a strong sponsor in the world of Java in JetBrains, the company behind IntelliJ IDEA. 2013 saw several new releases of Kotlin: Kotlin M5.1, Kotlin M6, Kotlin M6.1, and Kotlin M6.2. I found the blog post Programming Android with Kotlin interesting because it demonstrates use of Kotlin and Gradle to build an Android application.

Go

The Go programming language has had strong backing from Google and continues to receive significant online coverage. Go 1.1 and Go 1.2 (with apparently improved performance) were both released in 2013. Of special interest to me is Go's advertised source code backwards compatibility for all versions 1.x.

Camel

2013 was a big year for Apache Camel, the tool that "empowers you to define routing and mediation rules in a variety of domain-specific languages." Camel-related developments in 2013 included the release of 2.11.0, release of 2.12.0, and release of 2.12.2. These frequent releases and the addition of a new committer and PMC member are among the signs of a healthy open source project.

The release of the Camel Essential Components (DZone Refcardz #170) kicked off 2013 for Camel. Camel got increased attention on software development social media sites in 2013. Zemian Deng's Getting started with Apache Camel using Java was syndicated on Java Code Geeks (as was his Apache Camel using Groovy Introduction) and Niraj Singh's Introduction to Apache Camel was also syndicated on Java Code Geeks. AndrejV's entire blog Just Did Some Code has so far (5 posts in 2013) been devoted to coverage of Camel!

Spring Boot

It's still early to tell because Spring Boot is currently only at version 0.5, but Spring Boot has potential to be be widely adopted and used in the future. It looks like Spring Boot is inspired by and takes advantage of some of the best ideas in Ruby on Rails and Groovy and applies them to easy generation of Spring Framework-based applications.

Python

As stated earlier, Big Data is big and Python is getting a share of that Big Data action. The Continuum Analytics post Python for Big Data states, "Python is a powerful, flexible, open-source language that is easy to learn, easy to use, and has powerful libraries for data manipulation and analysis. ... Python has a unique combination of being both a capable general-purpose programming language as well as being easy to use for analytical and quantitative computing." Tal Yarkoni echoes this statement and observes that his "scientific computing toolbox been steadily homogenizing" on Python.

Python 3.3.1, Python 3.3.2, and Python 3.3.3 were all released in 2013. Cython has joined Pyrex as an alternative for easily writing C extensions with Python syntax and there is even a book on Learning Cython Programming.

The article Python 3.4.0 goes to beta with slew of new modules talks about some of the new features coming with Python 3.4.0 (beta) such as a standard enumeration construct. The article also points out that one of the biggest frustrations with Python remains: the two versions of the language (2.x and 3.x) and no easy route from 2.x to 3.x. From a Java development perspective, I find this interesting because there was a time when arguments like Bruce Eckel's ("People who don't want to deal with these changes don't upgrade, and those people tend not to upgrade anyway") seemed logical and sensible. However, it's not quite as easy as it sounds, particularly when one starts to realize the impact of this on the entire set of products, libraries, and frameworks written for a language that can be heavily impacted and perhaps not usable for some time if ever with the new language.

PHP and HHVM

2013 saw the formal release of the PHP 5.5.x versions: PHP 5.5.0, PHP 5.5.1, PHP 5.5.2, PHP 5.5.3, PHP 5.5.4, PHP 5.5.5, PHP 5.5.6, and PHP 5.5.7.

At the beginning of 2013, Gabriel Manricks outlined reasons Why 2013 is the Year of PHP. Specifically Manricks described tools such as Laravel (including Eloquent ORM), Composer (dependency manager, including Packagist), and PHPUnit (test-driven development in PHP).

The Facebook project HHVM (HipHop Virtual Machine for PHP) was initially released in 2010, but seemed to see a lot more attention in 2013. The original HPHPc compiler compiled PHP into C++ and was another manifestation of the drive to use a single language for authoring an application even if its compiled form was different. The availability of the open source HipHop Virtual Machine (HHVM) for PHP should help address performance issues with PHP; that is seemingly Facebook's primary reason for developing it.

Android Studio

Android Studio was announced at Google I/O 2013 as "a new IDE that’s built with the needs of Android developers in mind" that is "based on the powerful, extensible IntelliJ IDEA Community Edition."

Cloud Computing

Interest in cloud computing remained strong and continued to grow rapidly in 2013. Many of the other items discussed in this post (Big Data, security, technical dysfunctions, etc.) have strong relationships to cloud computing. For more on the biggest cloud stories on 2013, see The 10 Biggest Cloud Stories Of 2013.

Internet Explorer 11

I have not used Internet Explorer except when forced to for a number of years. For a long time, I used Firefox almost exclusively and in recent years I've used Google Chrome almost exclusively on PCs and Firefox on Linux. When I have been forced by a particular web site to use Internet Explorer, I have done reluctantly and am reminded of the much slower performance of the browser than I'm used to in terms of startup and even navigation. I have noticed over this Christmas break, however, when I had to install Internet Explorer 11 manually because the automatic process kept failing, that it's a lot faster than even Internet Explorer 10 was. I still won't make it my primary browser, but it's nice that it performs much better when I do need to use it (such as to play Atari Arcade games without advertisements).

Internet Explorer 11 offers advantages for developers as well as users of the browser. Advertised benefits for developers (and by extension for users of these developers' applications) are improved standards compatibility, new F12 developer tools,

It's not all positive for Internet Explorer 11. Some people seem to want to downgrade to Explorer 10 and reportedly Internet Explorer 11 is presenting some problems for users of Microsoft's own CRM application (after earlier reportedly breaking Google and Outlook access).

It surprises me a bit that the main Microsoft IE URL (http://windows.microsoft.com/en-us/internet-explorer/download-ie) referenced by the Internet Explorer 11 Guide for Developers still advertises downloading of Internet Explorer 9, a version of that browser that Google has already stated they will no longer support.

Windows 8 Not As Successful

Windows 8 seems to be experiencing similar disappointment after Windows 7 that Windows Vista experienced after Windows XP. In fact, The 10 Biggest Software Stories Of 2013 states, "So it looks like Windows 7 will become the new Windows XP -- better get those downgrade rights ready."

Raspberry Pi

The Raspberry Pi continues to catch a lot of interest (2 million had been sold as of October of this year). There were seemingly endless posts on how to do a wide variety of things with the Raspberry Pi. Some of these that stood out most to me are Premium Mathematica software free on budget Raspberry Pi, GertDuino: An Arduino for Your Raspberry Pi, How an open-source computer kit for kids based on Raspberry Pi is taking over Kickstarter, Running OpenJFX on Raspberry Pi, and Simon Ritter: Do You Like Coffee with Your dessert? Java and the Raspberry Pi.

DevOps

The 10 Biggest Software Stories Of 2013 points out that "Cisco, Google and VMware last year invested in Puppet Labs" and that "another DevOps player, Opscode, raised $32 million and changed its name to Chef, the name of its flagship product."

Twitter Bootstrap

Bootstrap (alternatively known as Twitter Bootstrap and Twitter Blueprint) has become so popular and prevalent that there is now a popular (one of DZone's top posts in 2013)

post stating Please stop using Twitter Bootstrap. In August 2013, two years after the public release of Bootstrap, Bootstrap 3 was released (with 3.0.3 released in December). Everybody Should Code

The conversation of whether everybody should or code write code and develop software continued in 2013. Jessica Gross's writes about 10 places where anyone can learn to code and Megan O'Neil's article A Start-Up Aims to Teach Anyone to Write Computer Code features one of these places (Codecademy). Kevin Lindquist writes that software development isn’t just for coders anymore. Katie Elizabeth lists the reasons why everyone should learn to code while Chase Felker wonders if maybe not everybody should learn to code.

In 2013, President Obama (United States) asked America to learn computer science and it may be one of the few things Republicans and Democrats agree on, but Philip Bump argues, No, Mr. President, Not Everyone Needs to Learn How to Code.

SQL Strikes Back

NoSQL implementations have been all the rage for years, but 2013 seemed to present some resurgence in interest in SQL. Some NoSQL implementations added SQL or SQL-like syntax. SQLstream announces Return of the King: The Structured Query Language Is Back! and Jason Levitt and Sean Gallagher write "The hot new technology in Big Data is decades old: SQL."

The truth is that SQL never really went away and is heavily entrenched in software systems, but what is really interesting 2013 is the new thought and effort put into SQL development. word of Google's F1 SQL database ("a hybrid database that combines high availability, the scalability of NoSQL systems like Bigtable, and the consistency and usability of traditional SQL databases") is an example of this. Seth Proctor asks Do All Roads Lead Back to SQL? and writes of "NewSQL." In Software Development Trends for 2014, Werner Schuster states that "Many NoSQL DBs come with SQL or SQL-like languages" and asks, "Are SQL skills back in fashion?"

Conclusion

2013 may be remembered in popular culture as the year of selfies, but the developments in the software development world were far more substantive. In particular, it is interesting to see how developers in general are beginning to (or are remembering to) appreciate the ability to write an application front-to-back in a single language and to write responsive designs so that an application need be written only once for multiple platforms. The advantages of these approaches are not new to JVM (Java/Java EE) or CLR (.NET) developers, but seem to now be better appreciated by the more general developer community.

Previous Years' Significant Software Development Developments

The following are my posts similar to this one on items that I thought were of special import to software development in those respective years. I could definitely go back and add to some of these with things I've learned about since then for each of these years.

Tuesday, June 21, 2011

Software Development Posts of Interest - 21 June 2011

This post is a summary of some recent articles and posts related to software development that I have found to be interesting. They cover computer science as a career, the history of programming, the good and bad of Hibernate, mobile apps popularity relevant to web use, the necessity of learning JavaScript, and free electronic books for web developers.


Computer Science: A Top 5 In-Demand Degree

The Yahoo! Education article Top 5 In-Demand Degrees by Chris Kyle references the National Association of Colleges and Employers (NACE) "Job Outlook 2011" and lists "most in demand [degrees] at the bachelor's degree level." Among the five listed bachelors degrees are Engineering (#3), Business Administration (#5), and Computer Science (#4). The average salary for computer scientists is listed as over $100,000 (annual USD).

The United States Department of Labor is cited in the article. The Bureau of Labor Statistics website includes interesting insight on several related industries as part of their Occupational Outlook Handbooks (currently the 2010-2011 editions). These include Computer Scientists, Network/System/Database Administrators, and Software Engineers/Programmers. According to these documents, the job outlook in these industries is better than average.


The History of Programming

Mike Rozlog's The History of Programming is an interesting read. Rozlog not only covers the history of programming, but also looks at today and labels it the "land of the mixers" where "instead of coming up with something new, we now add from all different languages to create a new language." He cites Falcon as an example of this. He then briefly speculates on what the future might hold.

I learned several new facts about the history of programming from this article, but what I liked best was how Rozlog articulated something I have long felt:
For over the past 50 years, we have been rehashing the same ideas over and over. Requirements are not shrinking and customer expectations are not withering, so whatever language you choose to complete a project, make sure you like it and it gets the job done.

I could not have said it better myself.


Ten Free Ebooks Every Web Developer Should Have

There is a nice collection of free electronic books briefly summarized and referenced in the post 10 Free Ebooks Every Web Developer Should Have. The cited electronic books cover diverse topics of interest to web developers such as performance, security, web design, search interfaces, accessibility, best practices, web style, and HTML5.


iPhone/iPad Applications sans Objective-C

One of the referenced books is Jonathan Stark's Building iPhone Apps with HTML, CSS, and JavaScript. The ability to write applications for iPhone and iPad without having to learn Objective-C is exciting. The prevalence of HTML, CSS, and JavaScript knowledge make this combination attractive for developing applications for these platforms.


Does Everyone Need to Learn JavaScript Now?

Speaking of JavaScript, Mike Loukides writes that "JavaScript is now a necessity" in his article Why a JavaScript hater thinks everyone needs to learn JavaScript in the next year. Loukides writes that what has changed for JavaScript are the "game-changers" of the jQuery JavaScript library, JavaScript Object Notation (JSON), Node.js, and HTML5.

I too have never been a huge fan of JavaScript, but it has been a necessary language to know in any serious web development and I've reluctantly used it on and off over many years of web development. I am glad to see improved libraries and support making it easier to use. Most important to me is that increasing consistency of JavaScript implementations across multiple target browsers. For a Java developer used to "write once run anywhere," JavaScript's different treatment and behavior in different browsers has been maddening.

Another free ebook listed on the Ten Free Ebooks Every Web Developer Should Have post is Marijn Haverbeke's Eloquent JavaScript and I intend to give that book a look.


CoffeeScript

There seems to be rapidly growing interest in CoffeeScript, described as "a little language that compiles into JavaScript" in "an attempt to expose the good parts of JavaScript in a simple way." The CoffeeScript Cookbook site holds great promise as a repository of "recipes for the community by the community." Another recent post of interest for folks new to CoffeeScript is CoffeeScript Development in 3 mintutes.


Mobile Has Overtaken Web?

Leena Rao's TechCrunch article Flurry: Time Spent On Mobile Apps Has Surpassed Web Browsing references Charles Newark-French's post Mobile Apps Put the Web in Their Rear-view Mirror. Among other interesting observations, the Flurry post states, "In 2011, for the first time, smartphone and tablet shipments exceed those of desktop and notebook shipments" and adds, "Our analysis shows that, for the first time ever, daily time spent in mobile apps surpasses desktop and mobile web consumption." For more details on how these numbers were collected and processed, see the original post. Even if there may be some controversy surrounding the quality of the metrics and how they are gathered, there is no doubt that mobile apps have seen tremendous growth in use in recent years.


The Good, the Bad, and the Ugly of Hibernate

I like Steve Ayers's post Dr. Mindbender, Or How I Learned To Stop Worrying And Love Hibernate because he looks at Hibernate's good and bad points and where its use might make sense and where its use might not make sense. I have seen Hibernate abused fairly badly and its misuse has made things more difficult than they should be because its use was not appropriate. It's also the type of post I like because it demonstrates both a willingness to learn and change opinions and to be more insightful than simply "such and such is great" or "such and such is terrible."


JDK 7 Improvements to Javadoc

Jonathan Gibbons's post What's Up, Javadoc? provides interesting insight into "mostly under the covers" improvements to Javadoc in JDK 7. I especially like the fact that a CSS stylesheet is now used, making it easier to change appearance of Javadoc-generated documentation. Although many of the improvements to Javadoc may be largely internal and not so obvious to most Java developers, just the fact that Javadoc is getting some long-needed attention is encouraging.


PHP One-Liners

After writing the Ten Groovy One Liners to Impress Your Friends, I thought about writing a similar post for PHP because it's the latest language I'm trying to find time to investigate. I quickly realized I still lack the background knowledge required for something like this and that it would take significant effort to put it together. I was therefore happy to see that Martin Šrank has posted 10 PHP One Liners to Impress Your Friends. I believe that one of the advantages of reading posts like this, especially for scripting languages, is the ability to quickly learn some of the common syntax and library support used in various common scripting functions.


Conclusion

In this post, I have referenced some general software development posts of interest as well as a few specific to things like JavaScript and Hibernate. Several of these posts represent the current state of software development.

Monday, June 6, 2011

Early June 2011 Software Development Posts of Interest

This post summarizes some blog posts that I have found very interesting in the past week (posts may be older than this, but I saw them in the past week). The topics covered are fairly diverse.


Learning Groovy

I like Vasanth Dharmaraj's post Learning Groovy for a couple reasons. One obvious reason that I like this post is that Dharmaraj specifically references my blog. However, even if he had not done so, I still like it for a second reason: his description of his own experience with Groovy articulates what I have witnessed that many Java developers (includes myself) who aren't big on scripting feel when starting to use Groovy. He starts his post with this: "I have dabbled a bit with scripting languages before but for some reason never really used one long term. I think that might change with Groovy." The remainder of the post provides examples of how he was able to use Groovy to accomplish scripting tasks concisely. I have come to the same conclusion as Dharmaraj regarding Groovy use in a development environment: "Come to think of it Groovy could have saved me a ton of time I spent in writing small tools to help me in development."


Ten One Liners in Your Favorite Language

There was an interesting explosion of blog posts covering examples in different programming languages of single line solutions. It all started with the Scala post, but led to several other languages being covered as well. I found them interesting enough to motivate me to write the post Ten Groovy One Liners to Impress Your Friends. Here is a rundown of the posts that I am aware of as of this writing:

Because these posts generally implement the same solution in the different languages, it is an entertaining and enlightening experience to read the syntax and library use in the various languages and compare them. Although I don't use one-liners like these regularly, being able to read and compare them helps to learn more about my favorite languages as well as more about languages I know very little about.


C# Script

A recent Reddit post made me aware of the existence of CS-Script. The main page for CS-Script describes this project:
CS-Script is a CLR (Common Language Runtime) based scripting system which uses ECMA-compliant C# as a programming language. CS-Script currently targets Microsoft implementation of CLR (.NET 2.0/3.0/3.5/4.0) with limited support on Mono. CS-Script combines the power and richness of C# and FCL with the flexibility of a scripting system. CS-Script can be useful for system and network administrators, developers and testers. For any one who needs an automation for solving variety of programming tasks.

From this description, it sounds like CS-Script exists to meet the same needs in the C# area that Groovy serves in the Java area.


PHP Performance Tips

Eric Higgins has posted PHP performance tips which details "changes that you can make very quickly and painlessly" to "improve the performance of your PHP scripts." He covers things like upgrading the version of PHP and profiling PHP.


Windows Command Line Arguments

The post Everyone quotes command line arguments the wrong way discusses "popular solutions" that are "clear, simple, and wrong" before providing a "correct solution." This is very useful information for running Groovy and other scripts in a Windows environment.


DZone DevOps Site

DZone has added a new "Zone" called DevOps Zone with the subtitle "Bridging the Gap Between Development and IT." This new DevOps Zone features a graphic with overlapping circles that indicate "DevOps" is the integration/overlap of Development/Software Engineering with Quality Assurance and Technology Operations. It also includes a link to the What Is This Devops Thing? post.


C++/Java/Go/Scala Performance Compared

The Loop Recognition in C++/Java/Go/Scala paper generated a lot of buzz on the web recently. As its title suggests, it covers "a well specified, compact benchmark in four programming languages, namely C++, Java, Go, and Scala." The "Conclusions" section of the paper reaffirms what many of us already believed about the various languages, but it is interesting to see the methodology used and to read the observations. Nothing about it is changing my current language plans.


Oracle Contributes OpenOffice.org to Apache

It was announced this week that Oracle has proposed contributing OpenOffice.org to Apache Software Foundation. Many OpenOffice users are welcoming an Apache 2 license.


Schema.org

The post Bing, Google and Yahoo! announce Schema.org calls out the recent announcement that the three dominant search engine vendors are collaborating on an initiative to "create and support a common set of schemas for structured data markup on web pages." The stated purpose for Schema.org is:
A shared markup vocabulary makes easier for webmasters to decide on a markup schema and get the maximum benefit for their efforts. So, in the spirit of sitemaps.org, Bing, Google and Yahoo! have come together to provide a shared collection of schemas that webmasters can use.

In its current form, Schema.org's sole supported format is HTML Microdata. The Getting Started page states: "You use the schema.org vocabulary, along with the microdata format, to add information to your HTML content. While the long term goal is to support a wider range of formats, the initial focus is on Microdata."

In the post The False Choice of Schema.org, Manu Sporny acknowledges that the Schema.org announcement "may sound good on the surface," but then argues that "it is very bad news for choice on the Web." Sporny starts with the disclaimer that he is biased and acknowledges his interest in RDFa, but states that he makes the arguments outlined in his post because he has "been around long enough to know when freedom of choice on the Web is being threatened."


Android Development: Learn About Android

There is a relatively new blog called Android Development that in its two posts so far has covered the basics of beginning learning and doing Android development: Setting Up Your Android/Java Environment and Getting Familiar with Java/Eclipse. These first two posts make liberal use of screen snapshots and are likely a good starting point for someone new to Android development.


JCP.next Makes Progress

The so-called JCP.next initiative (JSR 348 more formerly known as "Towards a new version of the Java Community Process") received unanimous approval from Executive Committee members in its JSR Review Ballot. This is an early step in delivering on changes to the Java Community Process as described in the Oracle press release.


Conclusion

The posts referenced above cover a wide variety of topics that I have found interesting in the past week.

Saturday, May 28, 2011

File System Management with PHP

I blogged previously on using PHP on the command line, but I did not cover using PHP to access the file system in that post in the interest of blog post size. I use this post to cover some of the basics of PHP file system management.

Many of us who write and use scripts do so for functions related to the file system. We script actions we commonly perform in the file system. Specifically, we often find ourselves needing to copy files, rename files, remove files, and open and close files. We often need to perform certain logic based on certain characteristics of files and directories. It'd be difficult to seriously consider a language as a scripting language without decent file system support. Fortunately, PHP has built-in support for file system management. This support can be used in conjunction with command line PHP.

W3Schools.com is a proven valuable resource for learning about web technologies and their coverage of PHP Filesystem Functions is another example of that. The page reminds us that the PHP filesystem functions "are part of the PHP core" and "allow you to access and manipulate the filesystem." More importantly, this page also summarizes PHP file system configuration details, PHP file system functions, and PHP file system constants. Clicking on a function name leads to a page with more details on that function as well as a PHP code example using that function. Because I'll only cover a subset of these in this post, I wanted to make sure to reference this W3Schools page early.

The following script, demoPhpFileSystemManagement.php, demonstrates several of PHP's functions for determining file information. I list the whole script here and then reproduce portions of the script again as I discuss them.

demoPhpFileSystemManagement.php
#!/usr/bin/php
<?php
//
// demoPhpFileSystemManagement.php
//

do
{
   echo "\nWhich PHP File System Operation Do You Want To Run?\n\n";
   echo "1. Parse File Path Information\n";
   echo "2. Acquire an Absolute Path\n";
   echo "3. Get File Size\n";
   echo "4. Get Disk Size and Free Space\n";
   echo "5. Get File Times\n";
   echo "\nEnter 0 to Exit\n";
   echo "\n\nYour Choice: ";
   $selection = trim(fgets(STDIN));
}
while (!(   ($selection == "0") || ($selection == "1") || ($selection == "2")
         || ($selection == "3") || ($selection == "4") || ($selection == "5")));


switch ($selection)
{
   case "1":
      echo "Enter a file path: ";
      $filePath = trim(fgets(STDIN));
      $filePathInfo = parseFilePath($filePath);
      echo $filePathInfo;
      break;
   case "2":
      echo "Enter path: ";
      $filePath = trim(fgets(STDIN));
      $realPath = convertPathToAbsolute($filePath);
      echo $realPath;
      break;
   case "3":
      echo "Enter path and name of file: ";
      $filePath = trim(fgets(STDIN));
      $sizeOfFile = getSizeOfFile($filePath);
      echo "File ".$filePath." has a size of ".$sizeOfFile." bytes.";
      break;
   case "4":
      echo "Enter disk label: ";
      $diskLabel = trim(fgets(STDIN));
      $diskSpace = getDiskSizeAndFreeSpace($diskLabel);
      $percentageFree = $diskSpace[1] / $diskSpace[0];
      echo "Disk ".$diskLabel." has ".$diskSpace[1]." of ".$diskSpace[0]
          ." bytes free (".round($percentageFree*100)."%).";
      break;
   case "5":
      echo "Enter a file who access/changed/modified times are desired: ";
      $filePath = trim(fgets(STDIN));
      $fileTimes = getFileTimes($filePath);
      echo "File ".$filePath." was last accessed on ".$fileTimes[0]
          .", was last changed on ".$fileTimes[1]
          .", and was last modified on ".$fileTimes[2];
      break;
   case "0":
   default:
   echo "\n\n";
   exit();
}


/**
 * Parse the provided file path. Demonstrates the following PHP functions:
 *
 *  - basename() : Provides base portion of file path (file name).
 *  - dirname()  : Directory name portion of file path.
 *  - pathinfo() : All components of path (basename, directory name, extension).
 *
 * @param $filePath File path to be parsed.
 * @return File path information in a single String.
 */
function parseFilePath($filePath)
{
   echo "Parsing file path ...", $filePath, "\n";
   $fileBaseName = basename($filePath);
   $fileDirectoryName = dirname($filePath);
   $pathInfo = pathinfo($filePath);
   return "File Name: ".$fileBaseName."\nDirectory Name: ".$fileDirectoryName
         ."\nFileName: ".$pathInfo['basename']."\nDirectory Name: "
         .$pathInfo['dirname']."\nFile Extension: ".$pathInfo['extension']
         ."\nFile name without extension: ".$pathInfo['filename'];
}


/**
 * Convert the provided path to an absolute path.
 *
 * @param $filePath File path to be made absolute.
 * @return Absolute version of provided file path.
 */
function convertPathToAbsolute($filePath)
{
   echo "Converting file path ", $filePath, " to absolute path...\n";
   return realpath($filePath);
}


/**
 * Determine size of provided file.
 *
 * @param? $filePath Path and name of file whose size is needed.
 * @return Size of file indicated by provided file path and name (in bytes).
 */
function getSizeOfFile($filePath)
{
   echo "Getting size of file ", $filePath, "...\n";
   return filesize($filePath);
}


/**
 * Provide disk size and free space on disk for provided disk.
 *
 * @param $diskLabel Label of disk whose total size and free space are to be
 *    provided.
 * @return Array of two elements, first of which is total disk space (in bytes)
 *    and second of which is free disk space (in bytes).
 */
function getDiskSizeAndFreeSpace($diskLabel)
{
   return array(disk_total_space($diskLabel), disk_free_space($diskLabel));
}


/**
 * Provide access, changed, and modified times for given file path.
 *
 * @param filePath Path and name of file whose times are desired.
 * @return Array of three elements with first being the file's access time,
 *    second being the file's changed time, and third being the file's modified
 *    time.
 */
function getFileTimes($filePath)
{
   $dateTimeFormat = "d-m-y g:i:sa";
   $fileAccessTime = fileatime($filePath);
   $fileChangedTime = filectime($filePath);
   $fileModifiedTime = filemtime($filePath);
   return array(date($dateTimeFormat, $fileAccessTime),
                date($dateTimeFormat, $fileChangedTime),
                date($dateTimeFormat, $fileModifiedTime));
}
?>

Before going into more detailed coverage of the PHP file system functions used in the above example, I have observed my Java background in that PHP code. For example, I used Javadoc-style comments for the functions in the code. Fortunately, PHPDocumentor respects Javadoc-style comments when generating code documentation. The above code also demonstrates the difference of naming conventions I'm accustomed to in Java (camel case) and the naming conventions of PHP (all lowercase names with words separated by underscores) as shown by the PHP functions invoked.

The first part of the PHP script provides a simple text command-line menu that prompts the user to enter choices and file names and paths. This snippet of code does not do anything itself with the PHP file system functions, but it does demonstrate PHP standard input and output and the PHP switch statement. That first portion is reproduced here.

Command Line Menu and Input Processing
do
{
   echo "\nWhich PHP File System Operation Do You Want To Run?\n\n";
   echo "1. Parse File Path Information\n";
   echo "2. Acquire an Absolute Path\n";
   echo "3. Get File Size\n";
   echo "4. Get Disk Size and Free Space\n";
   echo "5. Get File Times\n";
   echo "\nEnter 0 to Exit\n";
   echo "\n\nYour Choice: ";
   $selection = trim(fgets(STDIN));
}
while (!(   ($selection == "0") || ($selection == "1") || ($selection == "2")
         || ($selection == "3") || ($selection == "4") || ($selection == "5")));


switch ($selection)
{
   case "1":
      echo "Enter a file path: ";
      $filePath = trim(fgets(STDIN));
      $filePathInfo = parseFilePath($filePath);
      echo $filePathInfo;
      break;
   case "2":
      echo "Enter path: ";
      $filePath = trim(fgets(STDIN));
      $realPath = convertPathToAbsolute($filePath);
      echo $realPath;
      break;
   case "3":
      echo "Enter path and name of file: ";
      $filePath = trim(fgets(STDIN));
      $sizeOfFile = getSizeOfFile($filePath);
      echo "File ".$filePath." has a size of ".$sizeOfFile." bytes.";
      break;
   case "4":
      echo "Enter disk label: ";
      $diskLabel = trim(fgets(STDIN));
      $diskSpace = getDiskSizeAndFreeSpace($diskLabel);
      $percentageFree = $diskSpace[1] / $diskSpace[0];
      echo "Disk ".$diskLabel." has ".$diskSpace[1]." of ".$diskSpace[0]
          ." bytes free (".round($percentageFree*100)."%).";
      break;
   case "5":
      echo "Enter a file who access/changed/modified times are desired: ";
      $filePath = trim(fgets(STDIN));
      $fileTimes = getFileTimes($filePath);
      echo "File ".$filePath." was last accessed on ".$fileTimes[0]
          .", was last changed on ".$fileTimes[1]
          .", and was last modified on ".$fileTimes[2];
      break;
   case "0":
   default:
   echo "\n\n";
   exit();
}

The remainder of the PHP script contains functions that use and demonstrate the PHP file system management functions.

PHP provides functions for easy access to file path details such as the directory of the file, the full name of the file itself, the file's extension, and the name of the file without extension. Some of these are demonstrated in the above example in the parseFilePath function, which is reproduced next. The function shows off PHP's basename, dirname, and pathinfo functions.

PHP Provides File Path Information
/**
 * Parse the provided file path. Demonstrates the following PHP functions:
 *
 *  - basename() : Provides base portion of file path (file name).
 *  - dirname()  : Directory name portion of file path.
 *  - pathinfo() : All components of path (basename, directory name, extension).
 *
 * @param $filePath File path to be parsed.
 * @return File path information in a single String.
 */
function parseFilePath($filePath)
{
   echo "Parsing file path ...", $filePath, "\n";
   $fileBaseName = basename($filePath);
   $fileDirectoryName = dirname($filePath);
   $pathInfo = pathinfo($filePath);
   return "File Name: ".$fileBaseName."\nDirectory Name: ".$fileDirectoryName
         ."\nFileName: ".$pathInfo['basename']."\nDirectory Name: "
         .$pathInfo['dirname']."\nFile Extension: ".$pathInfo['extension']
         ."\nFile name without extension: ".$pathInfo['filename'];
}

The output from running the above against an example file is now shown.



PHP provide a useful realpath function that provides an absolute version of a provided path. For example, it will resolve soft links and relative directories to return the absolute path. This is demonstrated in the convertPathToAbsolute function in my example (and reproduced in the next code listing).

Demonstrating Absolute Paths via realpath
/**
 * Convert the provided path to an absolute path.
 *
 * @param $filePath File path to be made absolute.
 * @return Absolute version of provided file path.
 */
function convertPathToAbsolute($filePath)
{
   echo "Converting file path ", $filePath, " to absolute path...\n";
   return realpath($filePath);
}

The above portion of the script produces the following output.



PHP makes it easy to determine the size of a file with the aptly named filesize function. My getSizeOfFile function demonstrates this and is listed on its own in the next code listing.

Getting File Size in PHP
/**
 * Determine size of provided file.
 *
 * @param? $filePath Path and name of file whose size is needed.
 * @return Size of file indicated by provided file path and name (in bytes).
 */
function getSizeOfFile($filePath)
{
   echo "Getting size of file ", $filePath, "...\n";
   return filesize($filePath);
}

The code leads to the output shown in the next image.


PHP also makes it easy to get disk space information. PHP's disk_total_space and disk_free_space functions are demonstrated in the code listing below for my getDiskSizeAndFreeSpace function.

PHP Disk Size and Free Space
/**
 * Provide disk size and free space on disk for provided disk.
 *
 * @param $diskLabel Label of disk whose total size and free space are to be
 *    provided.
 * @return Array of two elements, first of which is total disk space (in bytes)
 *    and second of which is free disk space (in bytes).
 */
function getDiskSizeAndFreeSpace($diskLabel)
{
   return array(disk_total_space($diskLabel), disk_free_space($diskLabel));
}

The above example is not only demonstrates PHP's disk_total_space and disk_free_space functions, but it also demonstrates using PHP's array function to create an array and place elements within the array in a single statement.

The output of this portion of the script is shown next.


The final function in my script is getFileTimes and its purpose is to demonstrate three PHP methods for accessing dates/times associated with files. Specifically, the fileatime, filectime, and filemtime functions are demonstrated.

PHP File Times
/**
 * Provide access, changed, and modified times for given file path.
 *
 * @param filePath Path and name of file whose times are desired.
 * @return Array of three elements with first being the file's access time,
 *    second being the file's changed time, and third being the file's modified
 *    time.
 */
function getFileTimes($filePath)
{
   $dateTimeFormat = "d-m-y g:i:sa";
   $fileAccessTime = fileatime($filePath);
   $fileChangedTime = filectime($filePath);
   $fileModifiedTime = filemtime($filePath);
   return array(date($dateTimeFormat, $fileAccessTime),
                date($dateTimeFormat, $fileChangedTime),
                date($dateTimeFormat, $fileModifiedTime));
}

The above code demonstrates the three methods fileatime, filectime, and filemtime. One of my first questions when running across these methods was, "What is the difference between 'changed time' and 'modified time'?" The answer is available in the PHP Manual which differentiate filemtime returning the last time the contents of the file were changed versus filectime which returns the "inode change time" of the file.

The output from running the above piece of the script is shown next.



Conclusion

PHP provides an impressive set of built-in functions for determining information about files, directories, and the file system in general. These functions can be very important in different types of scripts.