text:
SQL is yet another essential language for developers wishing to create data-driven websites. However, many developers are unfamiliar with various aspects of SQL; so in this article, we'll analyze ten essential tips.
1. Use The Right Language
Web developers often have a plethora of languages at their disposal. It is crucial for developers to use the proper language for the job.
Let's review the following code. In the first example, the developer is selecting all columns and all rows from the customer table. In the second example, the developer is selecting only the first name, last name and address from the customer table for a single customer with ID 1001. Not only does the second query limit the columns that are returned, it will also perform better.
SELECT * FROM customer;
SELECT firstName, lastName, shippingAddress FROM customer WHERE customerID = 1001;
When you are writing code, make sure that it works efficiently.
Too many developers are satisfied with code that performs adequately on 100 rows of data, with little thought ahead to when the database will have 10,000 rows.
2. Secure Your Code
Databases store valuable information. Because of this fact, databases are often prime targets for attack. Many developers are unaware that their code has critical security vulnerabilities, which is a very scary fact not only for clients, but also for you. Currently, developers can be held legally accountable if their own personal negligence results in a database security risk that is then exploited.
In case you aren't convinced about the seriousness of database security, these two articles should help drive the point home:
"The FBI and Virginia State Police are searching for hackers who demanded that the state pay them a $10 million ransom by Thursday for the return of millions of personal pharmaceutical records they say they stole from the state's prescription drug database."
Read the Washington Post article
"Kaspersky Lab, a Moscow-based security company, admitted today that a database containing customer information had been exposed for almost 11 days and that it only learned of the breach when Romanian hackers told the firm about it last Saturday."
Read the ComputerWorld article
Let's review another example using pseudo-code.
// Theoretical code
txtUserName.setText("eshafer' OR 1=1");
query = "SELECT username, password FROM users WHERE username = '" + txtUserName.getText() + "';";
// Final statement
query = "SELECT username, password FROM users WHERE username = eshafer OR 1=1;"
Hopefully you looked at that code above and noticed the vulnerability. The query will end up selecting all username and password records from the table, because 1 always is equal to 1. Now, this particular example doesn't accomplish much for the would-be hacker. However, there are nearly limitless possibilities for additional malicious code that can be added with catastrophic results.
How Can You Write Secure Code?
The solution is often DBMS specific; that is, it varies between MySQL, Oracle or SQL Server. In PHP with MySQL, for example, it is usual to escape parameters using the function mysql_real_escape_string before sending the SQL query. Alternatively, you can utilize prepared statements to "prepare" your queries. Make it your mission to understand the DBMS with which you are working and the inherent security issues.
SQL injection isn't the only security vulnerability for databases and developers to worry about, however, it is one of the most common methods of attack. It is important to test your code and be familiar with the latest security issues for your DBMS in order to protect against attacks.
3. Understand Joins
Single table SQL select statements are rather easy to write. However, business requirements often dictate that more complex queries must be written. For example, "find all orders for each customer, and display the products for each order". Now, in this particular situation, it would be likely that there is a customer table, an order table, and an order_line table (the last would be to resolve a possible many-to-many record relationship). For those who are slightly more familiar with SQL, it is readily apparent that a table join, actually, two table joins will be required for this query. Let's look at some sample code.
SELECT customer.customerID, order.order_id, order_line.order_item
FROM customer
INNER JOIN order
ON customer.customerID = order.customerID
INNER JOIN order_line
ON order.orderID = order_line.orderID;
Alright, simple enough. For those who don't know, the code above is an inner join. More specifically, the code above is an equi-join.
Let's define the various types of joins.
Inner Joins: The basic purpose of inner joins is to return matching records.
Outer Joins: Outer joins do not require each record to have a matching record.
- Left outer join: A left outer join of tables A and B will return all matching records of A and B, as well as any non-matched records from the left table, in this case, A.
- Right outer join: A right outer join of tables A and B will return all matching records of A and B, as well as any non-matched records from the right table, in this case, B.
- Full outer join: A full outer join of tables A and B will return all matching records of A and B, as well as any non-matched records from both tables.
Special thanks to Ronald Erdei for the images.
Self Joins
There is one last type of join that must be considered, which is a self join. A self join is merely a join from a table to itself.
In this situation, in order to find which employees are supervised by a given employee, a self join would be required.
Hopefully this clarifies the basic tenets of joins, as they are one of the primary features of SQL that makes it such a powerful database language. Make sure you use the proper join for your given situation.
4. Know Your Data Types
In SQL, typically each table column has an associated data type. Text, Integer, VarChar, Date, and more, are typically available types for developers to choose from.
When developing, make sure you choose the proper data type for the column. Dates should be DATE variables, numbers should be a numeric type, etc. This becomes especially important when we deal with a later topic: indexing; but I'll demonstrate an example of poor knowledge of data types below:
SELECT employeeID, employeeName
FROM employee
WHERE employeeID = 112457891;
Looks fine based on what we currently know, correct? However, what if employeeID is actually a string. Now we've got a problem, because the DBMS might not find a match (because string data types and integers are different types).
Therefore, if you're using indexing, you'll probably be perplexed as to why your query is taking forever, when it should be a simple index scan. This is the reason that developers need to pay special attention to data types and their applications. Non-key attributes which are IDs are often string types, as opposed to integers, because of the increased flexibility that is granted. However, this is also a trouble area for junior developers, who assume that ID fields will be integers.
Properly utilizing data types is essential to proper database programming, as they directly lead to query efficiency. Efficient queries are essential to creating quality, scalable applications.
5. Write Compliant Code
All programming languages have standards which web developers should be aware, and SQL isn't any different. SQL was standardized by ANSI and then ISO, with new revisions to the language being occasionally submitted. The latest revision is SQL:2008, although the most important revision that developers should be aware of is SQL:1999. The 1999 revision introduced recursive queries, triggers, support for PL/SQL and T-SQL, and a few newer features. It also defined that the JOIN statements be done in the FROM clause, as opposed to the WHERE clause.
When writing code, it is important to keep in mind why standards-compliant code is useful. There are two primary reasons why standards are used. The first is maintainability, and the second is cross-platform standardization. As with desktop applications, it is assumed that websites will have long lifespans, and will go through various updates to add new functionality and repair problems. As any systems analyst will tell you, systems spend a majority of their lifespan in the maintenance phase. When a different programmer accesses your code in 2, 5 or 10 years, will they still be able to understand what your code is doing? Standards and comments are designed to promote maintainability.
The other reason is cross-platform functionality. With CSS, there is currently an ongoing standards battle between Firefox, Internet Explorer, Chrome, and other browsers about the interpretation of code. The reason for the SQL standards is to prevent a similar situation between Oracle, Microsoft and other SQL variants such as MySQL.
6. Normalize Your Data
Database normalization is a technique to organize the contents of databases. Without normalization, database systems can be inaccurate, slow, and inefficient. The community of database professionals developed a series of guidelines for the normalization of databases. Each 'level' of normalization is referred to as a form, and there are 5 forms, total. First normal form is the lowest level of normalization, up to fifth normal form, which is the highest level of normalization.
- First Normal Form (1NF): The most basic level of data normalization, first normal form requires the elimination of all duplicate columns in a table, and also requires the creation of separate tables for related data, and identification of each table with a primary key attribute.
- Second Normal Form (2NF): Meets all the requirements of first normal form, and creates relationships between tables using foreign keys.
- Third Normal Form (3NF): Meets all the requirements of second and first normal forms, and removes all columns that are not dependent upon the primary key. Third normal form also removes all derived attributes, such as age.
- Fourth Normal Form (4NF): Fourth normal form adds one additional requirement, which is the removal of any multi-valued dependencies in relationships.
- Fifth Normal Form (5NF): Fifth normal form is a rarer form of normalization, in which case join dependencies are implied by candidate keys (possibly primary key values).
In the reality of database development, getting to 3NF is the most important jump. 4NF and 5NF are a bit more of a luxury (and sometimes a nuisance) in database development, and are rarely seen in practice. If you're struggling with the concepts, or remembering the first three forms, there is a simple relation. "The key, the whole key, and nothing but the key.", which relates to 1NF, 2NF, and 3NF.
The Benefits of Normalization
Now, without venturing too far into database theory, let's simply focus on the benefits of normalization. As the data progresses through the normalization forms, it becomes cleaner, better organized, and faster. Now, with a small database that has only 5 tables and 100 rows of data, this won't be readily apparent. However, as the database grows, the effects of normalization will become much more apparent with regards to speed and maintaining data integrity. However, there are some situations in which normalization doesn't make sense, such as when normalizing the data will create excessively complex queries required to return the data.
7. Fully Qualify Your Database Object Names
Now, this is a commonly ignored point; in fact, all the sample code I've demonstrated in this tutorial has essentially violated this tip. In terms of database development, a fully qualified object name looks as follows: DATABASE.schema.TABLE. Now, let's look at why fully qualified names are important, and in what situations they are necessary. The purpose of a fully qualified object name is to eliminate ambiguity. Beginning developers rarely have access to multiple databases and schemas, which complicates the issues in the future. When a given user has access to multiple databases, multiple schemas, and the tables therein, it becomes crucial to directly specify what the user is attempting to access. If you have an employee table, your boss has an employee table, and the schema that your web application is running on has an employee table, which are you really attempting to access?
Logically, the fully qualified name would look like DATABASE.SCHEMA.OBJECTNAME, however, syntactically (ie, in executable statements), it would simply be SCHEMA.OBJECTNAME. Although various DBMSes do have various syntax differences, the above style is generally applicable.
-- Not ''SELECT * FROM table''
SELECT * FROM schema.TABLE
Fully qualifying your database names is important when working with databases that are larger and are used by multiple users and contain multiple schemas. However, it is a good habit to get into.
8. Understand Indexing
A database index is a data structure that improves the speed of operations on a database table. Indexes can be created using one or more columns of a database table, providing the basis for both rapid random look ups and efficient access of ordered records. Indexing is incredibly important when working with large tables, however, occasionally smaller tables should be indexed, if they are expected to grow. Small tables that will remain small, however, should not be indexed (for example, if your book is 1 page, does it make sense to turn to the index?)
Many developers write their code and test it on a table with 10, or 100 rows, and are satisfied when their code performs adequately. However, as the table grows to 10,000, or 1,000,000 rows, the code slows to a snail's pace, and the client might as well go out to lunch waiting for the code to execute.
When a query searches a database for a matching record, there are two ways in which the search can be performed.
- The first, and the slowest way is a table scan. In a table scan, the query searches every record in the table looking for a match.
- The second, and the faster way is an index scan. In an index scan, the query searches the index to find the record. In non-database terms, a table scan would be the equivalent to reading every page in a book looking for a word, while an index scan would be the equivalent of flipping to the back of the book, finding the word, flipping to the specified page, and then reading the words on the page to find the word.
It is important to remember that indexes need to be rebuilt occasionally, as data is added to the table. Additionally, while indexes increase data access performance, it slows the modification of data. Because of this, most DBMSes have an option to temporarily disable an index to facilitate mass data modification, and then allow it to be re-enabled and rebuilt later.
9. Properly Use Database Permissions
When working with a database that has multiple users, it is important to properly handle various database permissions. Obviously, most databases have an administrator user, but does it always make sense to run your queries as the administrator? Additionally, would you want to provide all your junior developers and users with your administrator credentials in order to write their queries? Most likely not. The various possible permissions for your database depend on your DBMS, but there are common themes between them.
In MySQL, for example, typing "SHOW TABLES" will reveal a list of tables on your database, of which you will likely notice a 'user' table. Typing 'DESC user' will reveal that there are various fields on the user table. Along with a host, username and password, there is also a list of privileges that can be set for a user. Additionally, there is a 'db' table that governs more privileges for a specific database.
SQL Server provides the GRANT, DENY, and REVOKE statements to give or take away permissions from a user or role. Additionally, SQL Server provides roles such as db_writer, db_reader. Often, unknowledgeable developers grant these roles (as opposed to creating their own, custom roles) to other users, resulting in overall lowered database security, as well as the possibility of a user performing an unwanted operation.
Properly managing your database user permissions is essential to managing not only security, but also providing a foundation for faster development and protecting data integrity.
10. Know Your DBMS Limitations
Databases are powerful tools, however, they aren't without limitations. Oracle, SQL Server, and MySQL all have unique limitations on things such as maximum database sizes, maximum number of tables, and others. Many developers unknowingly choose a DBMS solution for their project without planning or considering the later requirements of their database.
Refer to your DBMS manual for the various limitations, for example, SQL Server limitations are located on the MSDN Website: http://msdn.microsoft.com/en-us/library/ms143432.aspx
In this article, we reviewed 10 essential tips for SQL developers. However, there are many other useful SQL techniques that could be mentioned; so please leave your thoughts in the comments, whether you think this article covered all the essential topics, or you think one was left out. Keep developing, and remember, the code you write supports the internet infrastructure, and without you, the internet would not be as successful as it is.
- Follow us on Twitter, or subscribe to the NETTUTS RSS Feed for more daily web development tuts and articles.


text: HTTP/1.1, part 5: Range Requests and Partial Responses Day Software 23 Corporate Plaza DR, Suite 280 Newport Beach CA 92660 USA +1-949-706-5300 +1-949-706-5305 firstname.lastname@example.com http://roy.gbiv.com/ One Laptop per Child 21 Oak Knoll Road Carlisle MA 01741 USA firstname.lastname@example.com http://www.laptop.org/ Hewlett-Packard Company HP Labs, Large Scale Systems Group 1501 Page Mill Road, MS 1177 Palo Alto CA 94304 USA email@example.com Microsoft Corporation 1 Microsoft Way Redmond WA 98052 USA firstname.lastname@example.com Adobe Systems, Incorporated 345 Park Ave San Jose CA 95110 USA email@example.com http://larry.masinter.net/ Microsoft Corporation 1 Microsoft Way Redmond WA 98052 email@example.com World Wide Web Consortium MIT Computer Science and Artificial Intelligence Laboratory The Stata Center, Building 32 32 Vassar Street Cambridge MA 02139 USA email@example.com http://www.w3.org/People/Berners-Lee/ World Wide Web Consortium W3C / ERCIM 2004, rte des Lucioles Sophia-Antipolis AM 06902 France email@example.com http://www.raubacapeu.net/people/yves/ greenbytes GmbH Hafenweg 16 MuensterNW48155 Germany +49 251 2807760 +49 251 2807761 email@example.com http://greenbytes.de/tech/webdav/ HTTPbis Working Group The Hypertext Transfer Protocol (HTTP) is an application-level protocol for distributed, collaborative, hypermedia information systems. HTTP has been in use by the World Wide Web global information initiative since 1990. This document is Part 5 of the seven-part specification that defines the protocol referred to as "HTTP/1.1" and, taken together, obsoletes RFC 2616. Part 5 defines range-specific requests and the rules for constructing and combining responses to those requests. Discussion of this draft should take place on the HTTPBIS working group mailing list (email@example.com). The current issues list is at and related documents (including fancy diffs) can be found at . The changes in this draft are summarized in . HTTP clients often encounter interrupted data transfers as a result of cancelled requests or dropped connections. When a cache has stored a partial representation, it is desirable to request the remainder of that representation in a subsequent request rather than transfer the entire representation. There are also a number of Web applications that benefit from being able to request only a subset of a larger representation, such as a single page of a very large document or only part of an image to be rendered by a device with limited local storage. This document defines HTTP/1.1 range requests, partial responses, and the multipart/byteranges media type. The protocol for range requests is an OPTIONAL feature of HTTP, designed so resources or recipients that do not implement this feature can respond as if it is a normal GET request without impacting interoperability. Partial responses are indicated by a distinct status code to not be mistaken for full responses by intermediate caches that might not implement the feature. Although the HTTP range request mechanism is designed to allow for extensible range types, this specification only defines requests for byte ranges. The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in . An implementation is not compliant if it fails to satisfy one or more of the MUST or REQUIRED level requirements for the protocols it implements. An implementation that satisfies all the MUST or REQUIRED level and all the SHOULD level requirements for its protocols is said to be "unconditionally compliant"; one that satisfies all the MUST level requirements but not all the SHOULD level requirements for its protocols is said to be "conditionally compliant." This specification uses the ABNF syntax defined in Section 1.2 of (which extends the syntax defined in with a list rule). shows the collected ABNF, with the list rule expanded. The following core rules are included by reference, as defined in , Appendix B.1: ALPHA (letters), CR (carriage return), CRLF (CR LF), CTL (controls), DIGIT (decimal 0-9), DQUOTE (double quote), HEXDIG (hexadecimal 0-9/A-F/a-f), LF (line feed), OCTET (any 8-bit sequence of data), SP (space), VCHAR (any visible USASCII character), and WSP (whitespace). The core rules below are defined in Section 1.2.2 of : OWS = ]]> The ABNF rules below are defined in other parts: ]]> ]]> HTTP/1.1 allows a client to request that only part (a range of) the response entity be included within the response. HTTP/1.1 uses range units in the Range () and Content-Range () header fields. An entity can be broken down into subranges according to various structural units. HTTP/1.1 has been designed to allow implementations of applications that do not depend on knowledge of ranges. The only range unit defined by HTTP/1.1 is "bytes". If a range unit is not understood in a request, a server MUST ignore the whole Range header (). If a range unit is not understood in a response, an intermediary SHOULD pass the response to the client; a client MUST fail. The server has fulfilled the partial GET request for the resource. The request MUST have included a Range header field () indicating the desired range, and MAY have included an If-Range header field () to make the request conditional. The response MUST include the following header fields: Either a Content-Range header field () indicating the range included with this response, or a multipart/byteranges Content-Type including Content-Range fields for each part. If a Content-Length header field is present in the response, its value MUST match the actual number of OCTETs transmitted in the message-body. Date ETag and/or Content-Location, if the header would have been sent in a 200 response to the same request Expires, Cache-Control, and/or Vary, if the field-value might differ from that sent in any previous response for the same variant If the 206 response is the result of an If-Range request, the response SHOULD NOT include other entity-headers. Otherwise, the response MUST include all of the entity-headers that would have been returned with a 200 (OK) response to the same request. A cache MUST NOT combine a 206 response with other previously cached content if the ETag or Last-Modified headers do not match exactly, see . A cache that does not support the Range and Content-Range headers MUST NOT cache 206 (Partial Content) responses. Furthermore, if a response uses a range unit that is not understood by the cache, then it MUST NOT be cached either. A server SHOULD return a response with this status code if a request included a Range request-header field (), and none of the ranges-specifier values in this field overlap the current extent of the selected resource, and the request did not include an If-Range request-header field. (For byte-ranges, this means that the first-byte-pos of all of the byte-range-spec values were greater than the current length of the selected resource.) When this status code is returned for a byte-range request, the response SHOULD include a Content-Range entity-header field specifying the current length of the selected resource (see ). This response MUST NOT use the multipart/byteranges content-type. A response might transfer only a subrange of an entity-body, either the request included one or more Range specifications, or because a connection was broken prematurely. After several such transfers, a cache might have received several ranges of the same entity-body. If a cache has a stored non-empty set of subranges for an entity, and an incoming response transfers another subrange, the cache MAY combine the new subrange with the existing set if both the following conditions are met: Both the incoming response and the cache entry have a cache validator. The two cache validators match using the strong comparison function (see Section 4 of ). If either requirement is not met, the cache MUST use only the most recent partial response (based on the Date values transmitted with every response, and using the incoming response if these values are equal or missing), and MUST discard the other partial information. This section defines the syntax and semantics of HTTP/1.1 header fields related to range requests and partial responses. For entity-header fields, both sender and recipient refer to either the client or the server, depending on who sends and who receives the entity. The "Accept-Ranges" response-header field allows a resource to indicate its acceptance of range requests. Origin servers that accept byte-range requests MAY send but are not required to do so. Clients MAY generate range requests without having received this header for the resource involved. Range units are defined in . Servers that do not accept any kind of range request for a resource MAY send to advise the client not to attempt a range request. The "Content-Range" entity-header field is sent with a partial entity-body to specify where in the full entity-body the partial body should be applied. Range units are defined in . The header SHOULD indicate the total length of the full entity-body, unless this length is unknown or difficult to determine. The asterisk "*" character means that the instance-length is unknown at the time when the response was generated. Unlike byte-ranges-specifier values (see ), a byte-range-resp-spec MUST only specify one range, and MUST contain absolute byte positions for both the first and last byte of the range. A byte-content-range-spec with a byte-range-resp-spec whose last-byte-pos value is less than its first-byte-pos value, or whose instance-length value is less than or equal to its last-byte-pos value, is invalid. The recipient of an invalid byte-content-range-spec MUST ignore it and any content transferred along with it. In the case of a byte range request: A server sending a response with status code 416 (Requested range not satisfiable) SHOULD include a Content-Range field with a byte-range-resp-spec of "*". The instance-length specifies the current length of the selected resource. A response with status code 206 (Partial Content) MUST NOT include a Content-Range field with a byte-range-resp-spec of "*". Examples of byte-content-range-spec values, assuming that the entity contains a total of 1234 bytes: The first 500 bytes: The second 500 bytes: All except for the first 500 bytes: The last 500 bytes: When an HTTP message includes the content of a single range (for example, a response to a request for a single range, or to a request for a set of ranges that overlap without any holes), this content is transmitted with a Content-Range header, and a Content-Length header showing the number of bytes actually transferred. For example, When an HTTP message includes the content of multiple ranges (for example, a response to a request for multiple non-overlapping ranges), these are transmitted as a multipart message. The multipart media type used for this purpose is "multipart/byteranges" as defined in . See for a compatibility issue. A response to a request for a single range MUST NOT be sent using the multipart/byteranges media type. A response to a request for multiple ranges, whose result is a single range, MAY be sent as a multipart/byteranges media type with one part. A client that cannot decode a multipart/byteranges message MUST NOT ask for multiple ranges in a single request. When a client requests multiple ranges in one request, the server SHOULD return them in the order that they appeared in the request. If the server ignores a byte-range-spec because it is syntactically invalid, the server SHOULD treat the request as if the invalid Range header field did not exist. (Normally, this means return a 200 response containing the full entity). If the server receives a request (other than one including an If-Range request-header field) with an unsatisfiable Range request-header field (that is, all of whose byte-range-spec values have a first-byte-pos value greater than the current length of the selected resource), it SHOULD return a response code of 416 (Requested range not satisfiable) (). Note: clients cannot depend on servers to send a 416 (Requested range not satisfiable) response instead of a 200 (OK) response for an unsatisfiable Range request-header, since not all servers implement this request-header. If a client has a partial copy of an entity in its cache, and wishes to have an up-to-date copy of the entire entity in its cache, it could use the Range request-header with a conditional GET (using either or both of If-Unmodified-Since and If-Match.) However, if the condition fails because the entity has been modified, the client would then have to make a second request to obtain the entire current entity-body. The "If-Range" request-header field allows a client to "short-circuit" the second request. Informally, its meaning is `if the entity is unchanged, send me the part(s) that I am missing; otherwise, send me the entire new entity'. If the client has no entity tag for an entity, but does have a Last-Modified date, it MAY use that date in an If-Range header. (The server can distinguish between a valid HTTP-date and any form of entity-tag by examining no more than two characters.) The If-Range header SHOULD only be used together with a Range header, and MUST be ignored if the request does not include a Range header, or if the server does not support the sub-range operation. If the entity tag given in the If-Range header matches the current cache validator for the entity, then the server SHOULD provide the specified sub-range of the entity using a 206 (Partial Content) response. If the cache validator does not match, then the server SHOULD return the entire entity using a 200 (OK) response. Since all HTTP entities are represented in HTTP messages as sequences of bytes, the concept of a byte range is meaningful for any HTTP entity. (However, not all clients and servers need to support byte-range operations.) Byte range specifications in HTTP apply to the sequence of bytes in the entity-body (not necessarily the same as the message-body). A byte range operation MAY specify a single range of bytes, or a set of ranges within a single entity. The first-byte-pos value in a byte-range-spec gives the byte-offset of the first byte in a range. The last-byte-pos value gives the byte-offset of the last byte in the range; that is, the byte positions specified are inclusive. Byte offsets start at zero. If the last-byte-pos value is present, it MUST be greater than or equal to the first-byte-pos in that byte-range-spec, or the byte-range-spec is syntactically invalid. The recipient of a byte-range-set that includes one or more syntactically invalid byte-range-spec values MUST ignore the header field that includes that byte-range-set. If the last-byte-pos value is absent, or if the value is greater than or equal to the current length of the entity-body, last-byte-pos is taken to be equal to one less than the current length of the entity-body in bytes. By its choice of last-byte-pos, a client can limit the number of bytes retrieved without knowing the size of the entity. A suffix-byte-range-spec is used to specify the suffix of the entity-body, of a length given by the suffix-length value. (That is, this form specifies the last N bytes of an entity-body.) If the entity is shorter than the specified suffix-length, the entire entity-body is used. If a syntactically valid byte-range-set includes at least one byte-range-spec whose first-byte-pos is less than the current length of the entity-body, or at least one suffix-byte-range-spec with a non-zero suffix-length, then the byte-range-set is satisfiable. Otherwise, the byte-range-set is unsatisfiable. If the byte-range-set is unsatisfiable, the server SHOULD return a response with a status of 416 (Requested range not satisfiable). Otherwise, the server SHOULD return a response with a status of 206 (Partial Content) containing the satisfiable ranges of the entity-body. Examples of byte-ranges-specifier values (assuming an entity-body of length 10000): The first 500 bytes (byte offsets 0-499, inclusive): The second 500 bytes (byte offsets 500-999, inclusive): The final 500 bytes (byte offsets 9500-9999, inclusive): Or: The first and last bytes only (bytes 0 and 9999): Several legal but not canonical specifications of the second 500 bytes (byte offsets 500-999, inclusive): The "Range" request-header field defines the GET method (conditional or not) to request one or more sub-ranges of the response entity-body, instead of the entire entity body. A server MAY ignore the Range header. However, HTTP/1.1 origin servers and intermediate caches ought to support byte ranges when possible, since Range supports efficient recovery from partially failed transfers, and supports efficient partial retrieval of large entities. If the server supports the Range header and the specified range or ranges are appropriate for the entity: The presence of a Range header in an unconditional GET modifies what is returned if the GET is otherwise successful. In other words, the response carries a status code of 206 (Partial Content) instead of 200 (OK). The presence of a Range header in a conditional GET (a request using one or both of If-Modified-Since and If-None-Match, or one or both of If-Unmodified-Since and If-Match) modifies what is returned if the GET is otherwise successful and the condition is true. It does not affect the 304 (Not Modified) response returned if the conditional is false. In some cases, it might be more appropriate to use the If-Range header (see ) in addition to the Range header. If a proxy that supports ranges receives a Range request, forwards the request to an inbound server, and receives an entire entity in reply, it SHOULD only return the requested range to its client. It SHOULD store the entire received response in its cache if that is consistent with its cache allocation policies. The HTTP Status Code Registry located at should be updated with the registrations below: Value Description Reference 206 Partial Content 416 Requested Range Not Satisfiable The Message Header Registry located at should be updated with the permanent registrations below (see ): Header Field Name Protocol Status Reference Accept-Ranges http standard Content-Range http standard If-Range http standard Range http standard The change controller is: "IETF (email@example.com) - Internet Engineering Task Force". No additional security considerations have been identified beyond those applicable to HTTP in general . Most of the specification of ranges is based on work originally done by Ari Luotonen and John Franks, with additional input from Steve Zilles, Daniel W. Connolly, Roy T. Fielding, Jim Gettys, Martin Hamilton, Koen Holtman, Shel Kaplan, Paul Leach, Alex Lopez-Ortiz, Larry Masinter, Jeff Mogul, Lou Montulli, David W. Morris, Luigi Rizzo, and Bill Weihl. HTTP/1.1, part 1: URIs, Connections, and Message Parsing Day Software email@example.com One Laptop per Child firstname.lastname@example.com Hewlett-Packard Company email@example.com Microsoft Corporation email@example.com Adobe Systems, Incorporated email@example.com Microsoft Corporation email@example.com World Wide Web Consortium firstname.lastname@example.com World Wide Web Consortium email@example.com greenbytes GmbH firstname.lastname@example.com HTTP/1.1, part 3: Message Payload and Content Negotiation Day Software email@example.com One Laptop per Child email@example.com Hewlett-Packard Company email@example.com Microsoft Corporation email@example.com Adobe Systems, Incorporated firstname.lastname@example.com Microsoft Corporation email@example.com World Wide Web Consortium firstname.lastname@example.com World Wide Web Consortium email@example.com greenbytes GmbH email@example.com HTTP/1.1, part 4: Conditional Requests Day Software firstname.lastname@example.com One Laptop per Child email@example.com Hewlett-Packard Company firstname.lastname@example.com Microsoft Corporation email@example.com Adobe Systems, Incorporated firstname.lastname@example.com Microsoft Corporation email@example.com World Wide Web Consortium firstname.lastname@example.com World Wide Web Consortium firstname.lastname@example.com greenbytes GmbH email@example.com HTTP/1.1, part 6: Caching Day Software firstname.lastname@example.com One Laptop per Child firstname.lastname@example.com Hewlett-Packard Company firstname.lastname@example.com Microsoft Corporation firstname.lastname@example.com Adobe Systems, Incorporated firstname.lastname@example.com Microsoft Corporation email@example.com World Wide Web Consortium email@example.com World Wide Web Consortium firstname.lastname@example.com firstname.lastname@example.com greenbytes GmbH email@example.com Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types Innosoft International, Inc. email@example.com First Virtual Holdings firstname.lastname@example.com Key words for use in RFCs to Indicate Requirement Levels Harvard University firstname.lastname@example.com Augmented BNF for Syntax Specifications: ABNF Brandenburg InternetWorking 675 Spruce Dr. Sunnyvale CA 94086 US +1.408.246.8253 email@example.com THUS plc. 1/2 Berkeley Square 99 Berkely Street Glasgow G3 7HR UK firstname.lastname@example.com Hypertext Transfer Protocol -- HTTP/1.1 University of California, Irvine email@example.com W3C firstname.lastname@example.com Compaq Computer Corporation firstname.lastname@example.com MIT Laboratory for Computer Science email@example.com Xerox Corporation email@example.com Microsoft Corporation firstname.lastname@example.com W3C firstname.lastname@example.com Registration Procedures for Message Header Fields Nine by Nine email@example.com BEA Systems firstname.lastname@example.com HP Labs firstname.lastname@example.com Media Type Specifications and Registration Procedures Sun Microsystems email@example.com firstname.lastname@example.com When an HTTP 206 (Partial Content) response message includes the content of multiple ranges (a response to a request for multiple non-overlapping ranges), these are transmitted as a multipart message-body (, Section 5.1). The media type for this purpose is called "multipart/byteranges". The following is to be registered with IANA . Note: Despite the name "multipart/byteranges" is not limited to the byte ranges only. The multipart/byteranges media type includes one or more parts, each with its own Content-Type and Content-Range fields. The required boundary parameter specifies the boundary string used to separate each body-part. multipart byteranges boundary none only "7bit", "8bit", or "binary" are permitted none none This specification (see ). none none none See Authors Section. COMMON none IESG For example: Other example: Notes: Additional CRLFs may precede the first boundary string in the entity. Although permits the boundary string to be quoted, some existing implementations handle a quoted boundary string incorrectly. A number of browsers and servers were coded to an early draft of the byteranges specification to use a media type of multipart/x-byteranges, which is almost, but not quite compatible with the version documented in HTTP/1.1. Transfer-coding and message lengths all interact in ways that required fixing exactly when chunked encoding is used (to allow for transfer encoding that may not be self delimiting); it was important to straighten out exactly how message lengths are computed. (, see also , and ) There are situations where a server (especially a proxy) does not know the full length of a response but is capable of serving a byterange request. We therefore need a mechanism to allow byteranges with a content-range not indicating the full length of the message. () Range request responses would become very verbose if all meta-data were always returned; by allowing the server to only send needed headers in a 206 response, this problem can be avoided. (Section and ) Fix problem with unsatisfiable range requests; there are two cases: syntactic problems, and range doesn't exist in the document. The 416 status code was needed to resolve this ambiguity needed to indicate an error for a byte range request that falls outside of the actual contents of a document. (Section , ) Clarify that it is not ok to use a weak cache validator in a 206 response. () Clarify that multipart/byteranges can consist of a single part. () If-Range = "If-Range:" OWS If-Range-v If-Range-v = entity-tag / HTTP-date OWS = Range = "Range:" OWS Range-v Range-v = byte-ranges-specifier / other-ranges-specifier acceptable-ranges = ( *( "," OWS ) range-unit *( OWS "," [ OWS range-unit ] ) ) / "none" byte-content-range-spec = bytes-unit SP byte-range-resp-spec "/" ( instance-length / "*" ) byte-range-resp-spec = ( first-byte-pos "-" last-byte-pos ) / "*" byte-range-set = ( *( "," OWS ) byte-range-spec ) / ( suffix-byte-range-spec *( OWS "," [ ( OWS byte-range-spec ) / suffix-byte-range-spec ] ) ) byte-range-spec = first-byte-pos "-" [ last-byte-pos ] byte-ranges-specifier = bytes-unit "=" byte-range-set bytes-unit = "bytes" content-range-spec = byte-content-range-spec / other-content-range-spec entity-tag = first-byte-pos = 1*DIGIT instance-length = 1*DIGIT last-byte-pos = 1*DIGIT other-content-range-spec = other-range-unit SP other-range-resp-spec other-range-resp-spec = *CHAR other-range-set = 1*CHAR other-range-unit = token other-ranges-specifier = other-range-unit "=" other-range-set range-unit = bytes-unit / other-range-unit suffix-byte-range-spec = "-" suffix-length suffix-length = 1*DIGIT token = ]]> ABNF diagnostics: Extracted relevant partitions from . Closed issues: : "Cache validators in 206 responses" () : "Normative and Informative references" : "Normative up-to-date references" Closed issues: : "Updating to RFC4288" Ongoing work on ABNF conversion (): Add explicit references to BNF syntax and rules imported from other parts of the specification. Ongoing work on IANA Message Header Registration (): Reference RFC 3984, and update header registrations for headers defined in this document. Closed issues: : "multipart/byteranges minimum number of parts" Ongoing work on ABNF conversion (): Use "/" instead of "|" for alternatives. Introduce new ABNF rules for "bad" whitespace ("BWS"), optional whitespace ("OWS") and required whitespace ("RWS"). Rewrite ABNFs to spell out whitespace rules, factor out header value format definitions. Closed issues: : "State base for *-byte-pos and suffix-length" Ongoing work on Custom Ranges (): Remove bias in favor of byte ranges; allow custom ranges in ABNF. Final work on ABNF conversion (): Add appendix containing collected and expanded ABNF, reorganize ABNF introduction. Closed issues: : "base for numeric protocol elements" Closed issues: Fixed discrepancy in the If-Range definition about allowed validators. : "multipart/byteranges for custom range units" : "range unit missing from other-ranges-specifier in Range header" : "move IANA registrations for optional status codes"

subset: commoncrawl


text:
Mark A. Peterson
A specialist on American national institutions, much of Professor Peterson's scholarship focuses on interactions among the Presidency, Congress, and interest groups, evaluating their implications for policy making, both within the general domain of domestic policy and with special attention to national health care policy and Medicare reform.
He has written extensively on how Congress responds to presidential legislative initiatives, exploring how different political, economic, and institutional settings affect coalition building, promote inter-institutional conflict or cooperation, influence the president's legislative performance, and establish the baseline for assessing the performance of individual leaders (includingLegislating Together: The White House and Capital Hill from Eisenhower to Reagan, Harvard University Press). He has also investigated the ways in which presidents use relationships with organized interests to promote their administration's political or programmatic agendas, based on the presidential objectives and strategic calculations. As a participant in the Annenberg Institutions of American Democracy Project, with Public Policy Department colleague Joel Aberbach he co-chaired the Commission on the Executive Branch and co-edited the volume it produced on the politics and performance of the presidency and bureaucracy (Institutions of American Democracy: The Executive Branch, Oxford University Press), which won the Richard E. Neustadt Award from the Presidential Research section of the American Political Science Association. He has also contributed to its study of public and elite opinion on the performance of American institutions (Institutions of American Democracy: A Republic Divided, Oxford University Press) and the role of policy research in policy making. In addition, he edited Health Markets? The New Competition in Medical Care, Duke University Press; and co-edited both Uncertain Times: Kenneth Arrow and the Changing Economics of Health Care, Duke University Press) and the four-volume edited seriesHealth Politics and Policy (Sage), as well as edited the special health policy journal issues, The Managed Care Backlash and Who Shall Lead?Much of his most recent research has been to produce a book manuscript entitled "The Time Was Right: Political Contexts ad Strategic Choices on the Long Road to Health Reform." Encompassing the last 100 years, it examines how recognized problems in the health care system, the influence of public opinion, transformation of the interest group community, institutional dynamics in Congress, changes in the context and demands of political leadership, various dimensions of social learning by policy makers, and strategic and tactical choices by presidents both thwarted health care reform in the past and ultimately made possible the enactment of President Obama's Patient Protection and Affordable Care Act of 2010, but in a context that also primed the challenge of the law before the U.S. Supreme Court and prompted partisan attacks on its implemention.
Professor Peterson is also a founding team member of the UCLA-based multidisciplinary Blue Sky Health Initiative to transform the U.S. health and health care system, which has helped advise Congress on the inclusion of disease prevention and health promotion strategies in the Affordable Care Act. Previously, as an American Political Science Association Congressional Fellow, he served as a Legislative Assistant for Health Policy in the Office of U.S. Senator Tom Daschle. During 2000-2003 he was on the Study Panel on Medicare and Markets organized by the National Academy of Social Insurance. From 1993 to 2002, Professor Peterson was the editor of the Journal of Health Politics, Policy and Law, a leading bimonthly scholarly journal in the field. He later chaired the journal's Executive Committee, on which he remains a member, and also served on the Board of Editors of PS: Political Science & Politics and the Board of Editors of the Journal of Politics. He has often been interviewed for television, radio, and print media stories, including for CBS News, National Public Radio, New York Times, Washington Post, Los Angeles Times, USA Today, Christian Science Monitor, San Diego Union Tribune, Arizona Republic,Milwaukee Journal Sentinel, CQ Weekly, The Hill, American Medical News, Le Monde, Correio Braziliense, Jornal do Brasil.Professor Peterson has been an elected member of the Council of the American Political Science Association (2008-2010) and a member of its Administrative Committee, a founding member of the Association's Organized Section on Health Politics and Policy, and was elected President of its Organized Section on Public Policy. He has served on various committees for the American Political Science Association, Midwest Political Science Association, the Western Political Science Association, and AcademyHealth. He chairs the National Advisory Committees for both the Robert Wood Johnson Foundation's Scholars in Health Policy Research program and its Changes in Health Care Financing and Organization (HCFO) program, and is a member of the National Advisory Committees for the Foundation's Investigator Awards in Health Policy Research Program and Center for Health Policy at the University of New Mexico. He is an elected member of the National Academy of Social Insurance. Other honors include the Pi Sigma Alpha Award from the Midwest Political Science Association, the E. E. Schattschneider Award from the American Political Science Association, and a Robert Wood Johnson Foundation Investigator Award in Health Policy Research.At UCLA, he served as Chair of the Department of Public Policy from 2002 to 2006. He is a Faculty Associate of the Center for Health Policy Research and the Institute for Society & Genetics; Co-Director of the Policy Core for the Center for HIV Identification, Prevention, and Treatment Services; and currently is on the faculty advisory committee of the Center for American Politics and Public Policy and a member of the Community and Policy Advisory Board of the Robert Wood Johnson Clinical Scholars program at UCLA. He was previously served on the faculty boards of the Center for Policy Research on Aging and the Institute for Social Research. He is also currently a member of the University of California's Academic Senate Task Force on the Future of Health Benefits and the University of California Office of the President's Health Benefits Working Group.


text:
Fingers: Cysts and Pain
My middle-finger knuckles have tender growths. It hurts to push on the side of the joint. I'm 36 and have been climbing 17 years. The doctor said my knuckle bumps are related to Dupuytren's disease but I don't have any visible contractures on my palms or feet. X-rays and blood tests are normal. I also have plantar fasciitis in both feet.
My middle-finger knuckles have tender growths. It hurts to push on the side of the joint. I'm 36 and have been climbing 17 years. The doctor said my knuckle bumps are related to Dupuytren's disease but I don't have any visible contractures on my palms or feet. X-rays and blood tests are normal. I also have plantar fasciitis in both feet.
Dennis Sander | Jackson, Wyoming
Thanks for the Photos. Those nodules look more out of place than Dubya in a pink jumpsuit. As the Aussie ex-prime minister once said, "Be alert, not alarmed."
The same applies to you, though I am not fear mongering! A biopsy of the cysts might be helpful. And see a rheumatologist.
I can't tell you what they are, but I can say I'd want to know. Their appearance is certainly cyst-like, and could be related to an arthritic condition or a connective tissue disorder. I might be wrong. I hope I am. I assume the blood tests looked for rheumatoid factor (RF) and, given a sero-negative result, rheumatoid nodules as related to rheumatoid arthritis (RA) are unlikely, though RA is still quite possible.
Given that the x-rays did not show joint degeneration, and that the blood tests were normal, the cysts are possibly related to a group of autoimmune arthritic disorders called seronegative polyarthropthies (no tell-tale RF in the blood). In many of these conditions other systems are often affected, for instance the skin (psoriasis), eyes (reactive arthritis) or bowel (inflammatory bowel disease).
The Dupuytrens diagnosis could be a possibility. I have never heard of related cyst formations like yours but, absurd as it sounds, I'm not the repository of all medical knowledge. Certainly, plantar fasciitis correlates with seronegative arthridities, as it is a connective tissue disorder itself.
Many cases of seronegative arthritis will go unclassified, as the genetics and their expression are peculiar to the affected person. If — and when — the condition evolves, it may subsequently be classed as a known autoimmune pathology such as rheumatoid or psoriatic arthritis, or more serious conditions such as systemic lupas erythematosus (SLE). Did I mention a rheumatologist?
The side-bending pain is indicative that the joint, or the connective tissue holding it together, is under some duress (metabolic or climbing). Clearly it is seronegative (which is of limited diagnostic value), non-destructive to your joints (so far), and not too disabling (let's hope that continues!), but I think this is likely to be a very early or very mild expression of an autoimmune arthritis.
Take this diagnosis with a full salt-shaker and, um, go see a rheumatologist. I mean, really, they could just be silly cysts on the backs of your knuckles!
Two words, one letter: Vitamin E oil.
Fresh calluses are good; caveman-thick ones aren't. A few swipes of 1,000-grit sandpaper, as needed.
Use lotion. Not moisturizer.
Wash off chalk as soon as you are done climbing.
The white stuff comes in ball, block or crushed form, the difference between gumball, gum stick and ABC gum.
Some companies add drying agents that may be more expensive and wreak havoc on your epidermis.
Crush chalk. It's just magnesium-carbonate, not Yellowcake.
Placing tickmarks on desert cracks is like using crib notes.
Always carry chalk in a Ziplock bag in your carry-on. The TSA agent who pulls out the suspicious bag will experience the happiest moment of his entire day … until he realizes that it's not what he was hoping for.


text:
Do Not Sell
The electric car Smart ED is possibly the best value yet among zero emission cars.
I'll be honest. I don't really like Smart cars. The tiny two-seaters from Mercedes-Benz have always seemed heavy on design but light on value. For the same price that you pay for a Smart ForTwo you could easily get a car with more cargo space, four seats and fuel economy that's just about as good. On top of that, with their tall bodies, tiny wheelbases and a weirdly uncooperative transmissions the Smart's no pleasure to drive.
But by combining the ForTwo with a new electric drive system, Mercedes has finally created a Smart car even I can love. Compared to other electric cars, the Smart ED is genuinely cheap and, by getting rid of that balky transmission and noisy three-cyinder engine, it's really cool to whiz around town in.


text:
ATLANTA — Jacksonville's Jordan Todman and Atlanta's Josh Vaughn made strong final bids to win backup jobs by running for touchdowns as the Jaguars held on late for a 20-16 preseason win over the Falcons on Thursday night.
Mike Kafka, Jacksonville's third quarterback of the game, threw a 13-yard touchdown pass to Jeremy Ebert early in the fourth quarter to give the Jaguars the lead.
Todman, who appeared in only one game in his 2012 rookie season, was trying to take advantage of the void created when Justin Forsett missed the entire preseason with a toe injury. Todman had nine carries for 60 yards, including an 18-yard touchdown run, in his bid to win a backup job behind Maurice Jones-Drew.
Both teams held out most of their starters.
Falcons quarterback Domonique Davis was stopped on a fourth-and-goal run from the 3 with 1:51 remaining.
Atlanta's defense held and the Falcons took possession again at Jacksonville's 41 with 1:24 remaining. Davis ran for 5 yards before throwing three straight incompletions.
Davis, who played most of the game, completed 18 of 35 passes for 175 yards with an interception.
Vaughn, trying to win a job as Steven Jackson's backup, had a 65-yard touchdown run for the Falcons (0-4), who finished their second winless preseason in three years.
The Falcons also were 0-4 in the 2011 preseason before making the playoffs with a 10-6 regular season. Atlanta won only one preseason game last year before winning the NFC South with a 13-3 mark.
The Jaguars (1-3) took their first preseason win.
Falcons rookie quarterback Sean Renfree, a seventh-round pick from Duke, left the game in the third quarter with a right shoulder injury.
Vaughn, who played on the Falcons' practice squad in 2012, provided a rare offensive spark for the Falcons. Atlanta's only other touchdown came on a sack, forced fumble, fumble recovery and return for a touchdown by defensive end Jonathan Massaquoi in the second quarter.
Davis has spent the preseason as Matt Ryan's backup, but it's possible the Falcons could scan final roster cuts this weekend and add another quarterback.
With Blaine Gabbert sidelined with a broken thumb, Chad Henne started at quarterback for Jacksonville and had his second pass intercepted by Falcons rookie cornerback Robert Alford.
Gabbert, already named as the Jaguars' starter, is on pace to be cleared for the start of the regular season.
Gabbert is expected to have the cast removed from his right hand this weekend.
Atlanta's other rookie cornerback, first-round pick Desmond Trufant, picked off a pass from Chad Scott in the second quarter.
Henne recovered to lead a six-play, 60-yard touchdown drive in the first quarter — the only touchdown drive of the half for either offense. Henne had back-to-back completions of 14 yard to Todman and 13 yards to tight end Allen Reisner before Todman cut through the line for an 18-yard touchdown run.
The Jaguars led 10-0 when Massaquoi provided the play of the preseason for Atlanta's defense. Massaquoi sacked Scott for a loss of 8 yards at the Jaguars' 9, forcing Scott to fumble. Massaquoi picked up the fumble and ran in for the 9-yard touchdown run.
Atlanta kicker Jeremy Shelley, filling in while Matt Bryant recovers from a back injury, missed the extra point after he was wide right on a 48-yard field goal in the first quarter. Shelley made a 42-yarder late in the first half.
Scott had turnovers on back-to-back possessions, as Trufant's interception ended the Jaguars' next series. The turnovers may have severely damaged Scott's hopes of winning a backup job.
Scott completed 6 of 12 passes for 67 yards with the interception. Henne was 6-of-10 passing for 56 yards with an interception. Kafka completed 6 of 15 passes for 46 yards with a touchdown and no interceptions.


text:
Keeping cool and green
Innovations in air-conditioning systems mean cooling down buildings is going to require less energy
"AN ABSOLUTE dog's breakfast" is how David Collins describes the standard of fan blades in air-conditioning systems. This might seem to be something that would vex only an engineer like Mr Collins, the boss of Synergetics Environmental Engineering, based in Melbourne, Australia. But it is a big problem. If blades were designed for better aerodynamic efficiency, instead of for being stamped from sheet metal as cheaply as possible, the electricity consumption of many cooling systems could, he says, be cut by a third.
Huge effort has gone into warming up buildings as efficiently as possible; less into cooling them down. Most air-conditioning units, like refrigerators, use tubes containing chemical refrigerants which vaporise as they draw heat out of the air passing over them. This chilled air is then circulated with a fan to cool a building, a train or a car. Regulations are outlawing certain refrigerants, such as chlorofluorocarbons, which contain ozone-depleting chemicals. New developments would make cooling systems greener still because they would use less power.
Most air-conditioners using refrigerants consume lots of electricity because they employ mechanical compressors, which are piston-like machinery that squeeze the heated vapours. This turns the refrigerant back into its cooler liquid state to be used again. In countries where electricity is cheaper at night some air-conditioning machines now take a different approach. As the evening beckons, they start making ice. During the day fans blow air over the ice. In southern Europe roughly one in 20 air-conditioned offices is now cooled with ice, cutting electricity bills by about 10%.
Even bigger savings could be made with "thermal coolers". Instead of using a mechanical compressor running on electricity, thermal coolers are powered with hot water. A refrigerant vaporises, absorbing heat from the air to be cooled. Then a salty solution, commonly containing lithium bromide, absorbs the refrigerant vapours. When the container holding this liquid is bathed in hot water, the refrigerant separates from the salty solution and is recovered to be used again.
Sun up, heat down
Thermal coolers are an attractive option in places where hot water is available on the cheap as "waste heat", for example from coal- or gas-fired power plants. Where winters are short or mild, piping this water for use in district-heating schemes is prohibitively expensive. But if it can be used for air-conditioning as well then the sums change. In Europe, hot water from 50 or so district-heating networks is now also used to power thermal air-conditioning, according to Ursula Eicker, a refrigeration expert at the Stuttgart University of Applied Sciences in Germany.
She expects that this number will rise as efficiencies improve. In recent years thermal coolers have worked well with water at about 90°C or hotter. Now some models can be powered by water that is less than 80°C. This is important because in sunny climates rooftop solar panels are capable of heating water to 80°C. At present solar-cooling equipment is expensive. SolarNext, a German firm, has built a solar system to cool (and heat) a building almost the size of two family homes for about €50,000 ($63,000). Uli Jakob, who led the project, says recouping such an outlay would take a decade or more of energy savings. But he expects costs will fall as production of solar-cooling equipment ramps up.
Cars also use water to cool their engines. Once heated, could the water power the air-conditioning too? Sorption Energy, based in Oxford, Britain, is working with Fiat to develop a small thermal cooler that might do the job (and save petrol in the process: by some estimates roughly 5% of all petrol burned in Europe's cars is consumed by air-conditioning units). But drivers may have to wait until their engines warm up before the inside of their vehicles starts to cool down.
Evaporative coolers are a cheap alternative to refrigerative air-conditioning. The air near a splashing waterfall or fountain is cooler than the surrounding area because water droplets remove heat as they evaporate. Spraying water inside a cooling tower while air is blown through will have the same effect. Whereas refrigerative systems reduce the humidity of air (because some water vapour condenses and is drained away), evaporative coolers increase humidity. This means they tend to be more popular in dry climates.
However, researchers at the National Renewable Energy Laboratory (NREL) in Colorado have designed an evaporative system that sprays ambient-temperature water into warm air to cool it, but in a way that also lowers the humidity. NREL uses syrupy liquids which contain salty desiccants to soak up the humidity. Hot water is used to heat the syrups and dry them out. NREL's technology, known as "desiccant-evaporative cooling", is still being developed, but it requires little power, not least because the hot water can be obtained from solar panels. Ron Judkoff of NREL thinks the process will consume only about a fifth of the energy of conventional air-conditioners, depending how dry the climate is to begin with.
The big increasing number of data centres that house computer servers could be among the first to benefit from some of these developments in cooling technology. These data centres use a lot of energy. IBM reckons that in some centres about half of all the electricity consumed is spent cooling equipment. Mr Collins's company, Synergetics, is working on what it calls a "surgical ventilation" system which uses small tubes with fans that whisk heat away from hot components inside servers before it warms nearby parts. This heat could then be used to power thermal air-conditioning. And, of course, the fans will be aerodynamically perfect.
This article appeared in the Science & technology section of the print edition under the headline "Keeping cool and green"
Science & technology July 17th 2010
From the July 17th 2010 edition
Discover stories from this section and more in the list of contentsExplore the edition
More from Science & technology
Fusion power is coming back into fashion
This time it might even work
To ensure vaccines work properly, men should get a good night's sleep
The case for women is less clear
Evidence is growing that playing contact sports can lead to long-term brain injuries
Rugby players are taking their sport's governing bodies to court, alleging harm


text:
#4878 - PNEU SUPER MUDDERS (165x88mm/2p.)
Savage/Comprend la mousse interieure
The Super Mudders from HPI Racing have been designed to take on the toughest off-road conditions and can be used for on-road driving as well. They feature a highly aggressive tread design with large corner blocks to give extra bite on the outer most portion of the sidewall. This aids in climbing and technical driving conditions.
Designed to fit Savage and T-Maxx monster truck wheels, the Super Mudders are sure to be a big hit with off-road enthusiasts. Each package contains two moulded rubber tires with preassembled foam inserts for additional performance and handling. Fits all [83X56mm] standard Savage wheels such as Ringz, GT5 and Dish.