Publications of M. Tim Jones

I'm M. Tim Jones, product architect and engineering author.  On this page are book descriptions (with errata) and other online publications.



This book continues from the first edition and provides everything that you'll need to develop applications in the GNU/Linux environment. Split into 5 distinct parts, the book covers GNU tools, topics in application development, shells and scripting, debugging and hardening, and introductory optics including the fundamentals of virtualization. New material in this edition includes exploration of advanced APIs, memory debugging, scripting with Python and Ruby, source control, and more. Published April 2008. See more at Course Technology.


This new AI text, focused on the academic market provides grounding in the theory and practice of the various AI algorithms and methods.  The text also follows a "systems" approach, discussing the application of the algorithms in real-world environments.  Released Q4 2007.  See more at Infinity Science Press.
AI App 2/e

This second edition of AI Application Programming builds on the first edition with the addition of five new chapters classifier systems, natural language processing, particle swarm optimization, A-Star pathfinding and reinforcement learning.  The text also includes updates for erratum for the first and second printing, additions to the backpropagation learning chapter (for batch-updating) and numerous other additions.

Here's a review from the version sold in India through Wiley/Dreamtech.  Another review at a Sun blog.  More reviews on Amazon, and an interesting blog entry on the book's discussion of evolutionary algorithms and neural networks.  The book is also being used as part of a course in game AI at Taiwan's National Chiao Tung University.  It's also the text for "Advanced CS Topics: Artificial Intelligence" at Graceland University.  The book is also a recommended text at CWU's course in Computational Intelligence.


GNU/Linux Application Development
India cover

Applications are wide and varied in GNU/Linux, and include not only pure applications, but also tools and utilities for the GNU/ Linux environment.  GNU/Linux Application Programming takes a holistic approach to teaching developers GNU/Linux programming using APIs, tools, communication, and scripting.

Covering a wide range of topics related to GNU/Linux application programming, the book is split into five parts:  The GNU/Linux Operating System; GNU Tools; Processes, Communication, and Coordination; Shells and Scripting; and Debugging.  Application and tool developers are introduced to the most useful aspects of the GNU/Linux operating system, including tools (compilation, automated build and package creation), standard libraries, communication and synchronization APIs, process and thread models, shell scripting and extension languages, and debugging.  After working through the text, programmers will have a solid foundation for developing applications in the GNU/Linux environment.

[Why do I use GNU/Linux instead of just Linux?]
cover

Russian AI Translation
In AI Application Programming, I've demonstrated the applicability of AI algorithms and techniques in a range of different problem areas. My goal with this book was to illustrate that AI can be used as a tool to solve practical problems.  Some of the AI algorithms that I discuss in the book include genetic algorithms, neural networks, rules-based systems, clustering algorithms, ant algorithms, fuzzy logic, hidden markov models, simulated annealing and intelligent agents.  Sample applications include a personalization engine, a rules-based reasoning system, a character trainer for game AI, a Web-based news agent, a genetic code optimizer, an artificial life simulation, and others.

Here's a review from Tom Copeland (who has a rubyforge project to port the C source examples to the Ruby language).  Here's another from ADTmag.com, and one more.  The version published in India (through Wiley-Dreamtech India Pvt. Ltd.) is reviewed here.  More reviews are available through Amazon.  This book is currently being used as a text book in Dr. Mario Aguilar's "Applied Artificial Intelligence" at Jacksonville State University, Tom Fernandez' Aritificial Intelligence course at Florida Atlantic University, and
Prof Paul McKevitt's Advanced Intelligent Multimedia at the University of Ulster.

In 2004, the book was translated into Russian by DMK Press. 

An erratum is available for this book here.
cover
The Sockets API is useful not only in traditional high-level language environments (such as C), but also in any worthwhile scripting language.  This book details the Sockets API, and discusses its use in scripting languages such as C, Perl, Python, Tcl, Ruby and Java.  Sample patterns are provided for each of the languages, such as an HTTP server and an SMTP client.

This book is split into three parts.  Part one details the Sockets API.  Part two discusses the Sockets API in each of the languages explored.  Finally, in Part three, software patterns are demonstrated for each of the languages, illustrating the strengths and weaknesses of the APIs for each language.

Here's a review from Dan Weeks (also available on Amazon).  Here's another one from Don Wilde at daemonnews.

An errata item is noted here.
cover

Chinese cover


In this book, I explore a variety of application layer protocols and then illustrate how they can be used in embedded (or non-embedded) systems.  For example, how can HTTP be used to control embedded devices, or how can SMTP be used for communication of data or control from remote embedded systems?  This book explores these topics, discusses all protocols in detail (with open source implementations), and demonstrates an application in a practical domain.  Protocols discussed include HTTP, SMTP (server and client), NNTP, POP3, SLP, SNMP and a embeddable CLI.


The book has been translated into Chinese, the link is available here.  The book can be purchased in India through Firewall Media here.  It's also on Wind River's suggested reading list here.

An erratum is available for this book here.





Articles and Papers

Below is a selection of papers that I've written in the last few years (with links when available online).

" Anatomy of Linux Journaling File Systems, IBM developerWorks, June 2008.
In recent history, journaling file systems were viewed as an oddity and thought of primarily in terms of research. But today, a journaling file system (ext3) is the default in Linux®. Discover the ideas behind journaling file systems, and learn how they provide better integrity in the face of a power failure or system crash. Learn about the various journaling file systems in use today, and peek into the next generation of journaling file systems.

"Anatomy of Linux Flash File Systems, IBM developerWorks, May 2008.
You've probably heard of Journaling Flash File System (JFFS) and Yet Another Flash File System (YAFFS), but do you know what it means to have a file system that assumes an underlying flash device? This article introduces you to flash file systems for Linux explores how they care for their underlying consumable devices (flash parts) through wear leveling, and identifies the various flash file systems available along with their fundamental designs.

"Anatomy of Real-Time Linux Archictures, IBM developerWorks, April 2008.
It's not that Linux isn't fast or efficient, but in some cases fast just isn't good enough. What's needed instead is the ability to deterministically meet scheduling deadlines with specific tolerances. Discover the various real-time Linux alternatives and how they achieve real time from the early architectures that mimic virtualization solutions to the options available today in the standard 2.6 kernel.

" Anatomy of Security-Enhanced Linux (SELinux), IBM developerWorks, April 2008.
Linux has been described as one of the most secure operating systems available, but the National Security Agency (NSA) has taken Linux to the next level with the introduction of Security-Enhanced Linux (SELinux). SELinux takes the existing GNU/Linux operating system and extends it with kernel and user-space modifications to make it bullet-proof. If you're running a 2.6 kernel today, you might be surprised to know that you're using SELinux right now! This article explores the ideas behind SELinux and how it's implemented.

" Explore Ubuntu Mobile and Embedded Edition, IBM developerWorks, January 2008.
Ubuntu Mobile and Embedded Edition (Part of the Ubuntu Gutsy Gibbon Linux Distribution) is an environment designed to simplify integration with UMPC (ultra-mobile PC). Ubuntu includes this support as part of its standard Linux environment. This tutorial introduces you to UME, the tools provided within it (such as Moblin), and how to build a full embedded environment for a supported UMPC.

" Application Development for the OLPC Laptop, IBM developerWorks, December 2007.
This tutorial continues from an earlier article on the OLPC (now called the XO-1). After providing an introduction to the XO-1 and its history, the tutorial shows you how to build a simple graphical application in Python for the XO-1. This includes an introduction to the basic interfaces and methods for integrating with the Sugar graphical environment.

"Anatomy of the Linux SCSI Subsystem, IBM developerWorks, November 2007.
SCSI is a collection of standards that define how to communicate with a large number of devices (mostly storage related). This article explores SCSI and how it's implemented within the Linux kernel. It also introduces some of the acvances being made in SCSI such as SAS, FCoE and DIF.

"Anatomy of Linux Synchronization Methods, IBM developerWorks, October 2007.
This article explores the various synchronization methods available in the kernel (such as the atomic operations, spinlocks, reader/writer locks, and kernel semaphores). It also discusses concurrency and the reasons behind the need for the methods.

"Anatomy of the Linux file system, IBM developerWorks, October 2007.
This article explores filesystems within Linux, which is a another great example of abstraction. For example, when you perform a 'read' operation, that could be to a ext2, ext3, JFFS or any other type of filesystem, but on many different types of storage medium (ramdisk, USB flash stick, SAS disk, etc.). The combinations are huge, but the Linux filesystem layer provides a model abstraction for dealing various filesystems on various mediums. This article will introduction the Linux filesystem layer and then explore the major structures and APIs that implement this module.

"System Emulation with QEMU, IBM developerWorks, September 2007.
QEMU is a platform emulator which means that you can emulate an entire PC on another operating system (such as Linux or Windows). This article introduces the ideas behind QEMU, discusses some of its internals, and then demonstrates emulating another operating system on top of Linux.

"Anatomy of the Linux Networking Stack, IBM developerWorks, June 2007.
One of the greatest features of the Linux® operating system is its networking stack. It was initially a derivative of the BSD stack and is well organized with a clean set of interfaces. Its interfaces range from the protocol agnostics, such as the common sockets layer interface or the device layer, to the specific interfaces of the individual networking protocols. This article explores the structure of the Linux networking stack from the perspective of its layers and also examines some of its major structures.

"Anatomy of the Linux Kernel", IBM developerWorks, June 2007.
The Linux® kernel is the core of a large and complex operating system, and while it's huge, it is well organized in terms of subsystems and layers. In this article, you explore the general structure of the Linux kernel and get to know its major subsystems and core interfaces.

"Anatomy of the Linux slab allocator", IBM developerWorks, May 2007.
An operating system commonly allocates and deallocates objects of a fixed size. Additionally, these objects can be initialized to a given structure. The slab allocator exploits the common size object behavior of an operating system, and also makes it easy to expand or shrink the memory requirements for a given object pool very simple. The slab allocator originated in the SunOS, but now finds its home in the Linux kernel.

"Discover the Linux Kernel Virtual Machine", IBM developerWorks, May 2007.
The newcomer to Linux virtualization is the Linux Kernel Virtual Machine, or KVM. This modification to the Linux kernel converts it into a Hypervisor, allowing it to host other operating systems such as Linux and Windows. The Linux KVM requires a processor with virtualization instructions, as can be found with the AMD Pacifica or Intel Vt.

"Sugar, the XO laptop, and One Laptop per Child", IBM developerWorks, April 2007.
OLPC is the One-Laptop-per-Child initiative, and its goal is to develop a $100 laptop for children around the world (now $150). The laptop itself is very interesting, as the laptop must be useful in different environments than our own. But what's most interesting about the XO laptop is that it runs GNU/Linux and is programmable using the Python language. This article explores the XO laptop and shows you how to build a simple activity (application) for a virtualized XO.

"Virtualization with coLinux", IBM DevelopWorks, April 2007.
Cooperation is probably the last thing that comes to mind when considering Linux and MS Windows, but that's what you get with coLinux.  The coLinux is a cooperative Linux kernel that virtualizes an entire Linux operating system on top of MS Windows.  You can get something similar wtih Cygwin, but coLinux has some advantages.

"Linux and Symmetric Multiprocessing", IBM developerWorks, March 2007
Linux and SMP are two great tastes, that taste great together.  This article provides an introduction to multiprocessing (in particular Chip-Level Multiprocessing, or CMP) and then discusses some of the SMP features of the Linux kernel.  It also briefly discusses how to exploit SMP for user-space applications.

"Parallelize Applications for Faster Linux Booting", IBM developerWorks, March 2007.
Linux out of the box is a general solution for desktop and server platforms.  But booting Linux, especially if you're a developer (particularly a kernel developer) can be a pain due to the time it takes to complete.  This article reviews two approaches of parallelizing the boot process through init replacements.  Initng is a dependency-based solution, services are dependent upon one-another, and once one service has started, other services that were dependent upon that can start.  Upstart is an event-based solution to init.  When a service starts, it can send events to kick-off other services.  Also explored in this article is bootchart, which is used to visualize the Linux boot process.

"Virtual Linux", IBM developerworks, December 2006.
Linux virtualization has many solutions, from full virtualization, para-virtualization, emulation, and many others.  This article explores the various methods that are available today for Linux virtualization, including the new kid no the block, the Kernel Virtual Machine (KVM).  Read the comments at Slashdot.  This article has been translated into Russian and Korean.

"Build a Web Spider on Linux", IBM developerworks, November 2006.
The goal of this article is to explore the various methods for developing web spiders on Linux.  It illustrates spider development using Python and Ruby.  You can read the sordid comments on slashdot, or digg.

"Data Visualization with Linux", IBM developerworks, Nobember 2006.
Linux is a great platform for data manipulation and visualization.  From GNUPlot and Octave to Scilab and IBM's OpenDX, this article covers that most useful with examples presented for each.

"Version Control for Linux", IBM developerworks, October 2006.
One of the great aspects of Linux for developers is the wide range of source configuration management (SCM) systems that are available.  From centralized to distributed repositories, and change-set versus snapshot models, this article explores the major SCM architectures and provides examples of each.  Also available in Japanese.

"New to IBM Systems", IBM developerworks, September 2006.
This article is fundamentally a marketing piece that introduces readers to IBM servers.

"Open Source Robotics Toolkits", IBM developerworks, September 2006.
This article reviews a number of open-source toolkits for robotics simulation and development.  From the Open Dynamics Engine (ODE) for modelling realistic physics, to TeamBots for modelling multi-agent systems.  Here's an intro from LinuxDevices, and a discussion at robots.net.

"Boost Application Performance Using Asynchronous I/O", IBM developerworks, August 2006.
Asynchronous I/O (or AIO) is a POSIX mechanism to increase performance of overlapped I/O applications by providing callback mechanisms for I/O completion.  This article explores the variety of I/O models available for Linux, and then digs into the AIO model with source demonstration.  The article is now a reference on Wikipedia.

"BusyBox simplifies embedded Linux Systems", IBM developerworks, August 2006.
BusyBox is the swiss army knife of Linux utilities.  BusyBox is interesting because it combines a large number of utilities into a single binary, allowing them to share the underlying common code.  This makes it a perfect utility for embedded Linux systems.  Here's an intro at LinuxDevices.com.  Also availabe in Chinese.

"Anatomy of the Linux Initial Ramdisk (initrd)", IBM developerworks, July 2006.
The Initial Ramdisk (or initrd) is a temporary root filesystem in ram that acts as an intermediary filesystem for module loading while the real root filesystem is not yet available.  This article explores the anatomy of the initrd, and demonstrates how you can build one from scratch.  This article has been translated into Japanese.

"Inside the Linux Scheduler", IBM developerworks Linux Zone, June 2006.
The Linux scheduler has evolved greatly over the years, and with the 2.6 kernel, has been transformed from an O(N) (linear time) scheduler to an O(1) (constant time) scheduler.  This article discusses the new Linux 2.6 kernel and other aspects such as SMP support and load balancing.  Here's an intro from LinuxDevices.  This article has been translated into Japanese.

"Inside the Linux boot process", IBM developerworks Linux Zone, May 2006.
This Linux boot process is very flexible, and supports booting on a large number of platforms from a variety of devices (hard disk, floppy, CD-ROM, USB Flash, network, etc.).  This article will walk you through the desktop x86 boot process, but also provide some information for embedded and network booting.

"Access the Linux Kernel using the /proc filesystem", IBM developerworks Linux Zone, March 2006.
The /proc virtual filesystem is a great way to permit communication (configuration and monitoring) between user-space applications and the kernel.    In this article you'll learn about /proc and explore a demonstration of a fortune cookie dispenser implemented as a kernel module with /proc.  This article has been translated into Chinese, Japanese, and also an introduction in Korean.

"Better networking with the Stream Control Transmission Protocol (SCTP)", IBM developerworks, February 2006.
In this article, I review the benefits of SCTP over TCP (from multi-streaming to multi-homing).  Sample code is also presented demonstrating the multi-streaming feature.  This article was also slashdotted.  It has been translated into Chinese.

"Automate Client Management with the Service Location Protocol (SLP)", IBM developerworks, February 2006.
Discusses the zero-configuration networking capabilities of SLP and demonstrates its use using a simple Daytime protocol example.  This article has been translated into Chinese.

"Boost Socket Performance on Linux", IBM developerworks Linux Zone, January 2006.
This article demonstrates four ways to boost the performance of sockets applications, from socket buffer tuning to kernel proc filesystem tuning.  Also read the sordid Slashdot comments on this article.

"Sockets Programming in Ruby", IBM developerWorks Linux Zone, October 2005.
Tutorial exploring the Sockets API and its integration into the Ruby object-oriented scripting language.  Discusses Ruby-specific features for sockets programming.

"Sockets Programming in Python", IBM developerWorks Linux Zone, October 2005.
Tutorial exploring the Sockets API and its integration into the Python language.  Discusses Python-specific features for sockets programming.

"Five pitfalls of Linux sockets programming", IBM developerWorks Linux Zone,  September 2005.
Discusses the development of reliable networking applications in heterogeneous environments.  Translations are available for Japanese and also Chinese.

"Visualize Function Calls withi Graphviz", IBM developerWorks Linux Zone, June 2005.
Using the GNU Compiler Toolchain, and a small amout of glue code, a dynamic graphical function call generator can be easily created.  Translations to this article are available in Japanese and also Chinese.

"GNU's C Language Extensions", C/C++ Users Journal, March 2005.
The GNU Compiler includes a variety of language extensions.  This article explores some of the more useful elements.

"Optimizing with GCC", Linux Journal, March 2005.
The GNU Compiler Collection (otherwise known as GCC) is the de facto standard compiler for Linux and also multi-platform embedded development.  This article discusses the 3.3 GCC optimizer and how to use it effectively to build optimized applications.

"Defensive Programming", C/C++ Users Journal, February 2005.
This article focuses on programming for reliability -- given that we make mistakes in the development of software, how can we program in a way that minimizes some common, and difficult to debug, mistakes.

"GNU Development", Circuit Cellar, January 2004.
This article provides a tour of software development with GNU tools, including the GNU compiler toolchain, build automation with make and a variety of other utilities.  This article is also available on Developer::Pipelines.

"An Embeddable Lightweight XML-RPC Server", Dr. Dobb's Journal, June 2003.
The XML-RPC protocol is explored in this article, with a simple implementation of a server in C.  The server is then demonstrated using a C and Python client.

"Personalization and Adaptive Resonance Theory", Dr. Dobb's Journal, October 2002.
This article discusses the use of the ART1 clustering algorithm for personalization (recommendation).

"Java Mobile Agents and the Aglets SDK", Dr. Dobb's Journal, January 2002.
Demonstrates the construction of simple mobile agents (migratory programs) in Java using IBM's Aglets SDK.

"Embed with the Mailman", Embedded Systems Programming, October 2001.
An SMTP server and client is discussed with source code suitable for use in embedded systems.  The SMTP client is discussed in applications of remote statusing (emitting data to a remote client).  The SMTP server is discussed from the perspective of command and control (sending emails to the embedded device with commands, and receiving back responses from the onboard SMTP client).

"An Embeddable HTTP Server", Dr. Dobb's Journal, October 2001.
An embeddable HTTP server is presented that is suitable not only for embedded systems, but those without file systems (EEPROM-based).  The concept of an application filesystem is presented along with the tools to build and integrate it with the HTTP server.

"Embedded Linux on the PowerPC", Embedded Linux Journal, July 2001.
In this article, I explore the use of Linux (Montavista Linux) on the Embedded Planet RPX-Net PowerPC board.

"CPJazz -- A Software Framework for Vehicle Systems Integration and Wireless Connectivity"
SAE 2000 World Congress.  Also appears in the book "Intelligent Vehicle Systems", ISBN 0-7680-0588-4.
Discusses research in connectivity between disparate devices and vehicle buses to disparate wireless assets in a vehicle environment.  The flexible CPJazz architecture provides a "software bus" architecture to seamlessly integrate buses and devices for intercommunication.


Presentations

"High Performance Networking", May 2003
I gave this presentation as a guest lecture in Sam Siewert's "Real-Time Embedded Systems" course at Colorado University in the Spring of 2003.  In this presentation, I discussed problems and solutions for scaling TCP/IP networking to gigabit networks through a variety of means.


Resume

Here's my resume as of Fall 2005 (pdf or html).


mtj@mtjones.com.

Last Updated June 2008.