210664 items (74 unread) in 24 feeds
CNN
(1 unread)
MSNBC
(4 unread)
PHP
(23 unread)
Deals
(35 unread)
Tech
(5 unread)
Web Development
(5 unread)
CNN Money
(1 unread)
Of note, you can also purchase two Nintendo Wii Games from a better selection of titles for $30 with $2.73 for shipping. Choose from 32 games, including DeBlob, Shaun White Snowboarding, Up, and more.
By Scott M. Fulton, III, Betanews
Despite the fact that game console manufacturers still drive studios toward exclusivity for individual titles, so that a popular Xbox 360 game isn't available for PlayStation 3 and vice versa, developers within those studios are insisting more and more upon cross-platform flexibility and portability. While they may be restricted to one console, they don't want those borders to extend to computers or to handsets.
For this reason, the Khronos Group has become more and more important to developers, and OpenGL is no longer being perceived as some kind of fallback standard, as in the phrase, "Your graphics use only OpenGL. Today, OpenGL is developers' ticket to portability between PCs, consoles, and handsets, and it's the only technology shining a ray of hope for cross-console portability should it ever become politically feasible.
Today at the annual Game Developers' Conference, Khronos (whose principal members include AMD, Nvidia, and Sony) unveiled on schedule the 4.0 version of its OpenGL cross-platform rendering language for 3D virtual environments. To understand the significance of this event, you have to understand a bit more about the challenges that game developers are facing. Specifically, as screen sizes become larger on average, screen resolutions grow finer, and screens by number increase beyond one per system, the types of simplifications that made 3D scenes look "good enough" for older PCs actually look bad on modern systems. More finely-detailed systems make typical "fuzzifications" (my word for it, not Khronos') look more obvious.
It's still too arithmetically costly to expect 3D games and artistic applications to be ray tracers -- they can't assume the shading values for a huge number of traveling photons in space in real-time. We've talked before about how some graphics cards, including the first DirectX 10.1 cards from ATI in late 2007, can track a few photons, and fudge the remaining shader values for the rest.
But applying that type of calculation to OpenGL -- so it can be used with ATI and Nvidia (Intel? Maybe someday) -- requires the application to calculate how much...or more accurately, how little detail it can get away with, for certain points in space. Typically in OpenGL, developers have used lookup functions to determine the level of detail required to map any given area. As screen dynamics change, the number of functions required for a given space may increase, and their efficiency may decrease. As a result, it could take exponentially more time to make a scene look realistic -- to fuzz the focus of areas that are on the sidelines or out of range, or to blur regions that we're supposed to be flying by.
Khronos' engineers tackled this problem by extending the research begun earlier in the last decade (PDF available here) by SGI, the company that originally got the ball rolling for OpenGL. Technically, the whole technique is called "level of detail," but another way to refer to it is shader simplification. Used judiciously, it's a way to make certain elements of a scene seem clearer by selecting which others appear not so clear.
Screenshot of an early build of the Icarus Scene Engine, an OpenGL-based 3D scene editor that is itself rendered in 3D, using the OpenTK toolkit.
As scenes are processed, OpenGL effectively determines the active level of detail for any given shader (the equivalent of what Direct3D calls a "pixel," which isn't always a "pixel" per se). OpenGL 4.0 expedites this process by realizing that levels of detail should be remembered, so that when a function looks it up from the outside, it doesn't have to be recalculated. Thus, top of the list on version 4.0's list of changes is the new textureLOD function set, which will not impact how developers use the API -- it's like a retroactive fix. The new functions recall levels of detail rather than recalculate them.
These new functions are actually necessary for OpenGL to work (properly) on ATI Radeon HD 5xxx series graphics cards, which began shipping last year. Now developers are looking forward to ATI upgrading its 5xxx drivers to enable 4.0, now that 4.0 has enabled them.
The result may be an avoidance of the exponential lags that developers had been seeing as resolution and screen complexity increased. Double-precision floating-point vectors will be supported for the first time, also signifying the new dynamics of 3D rendering. And now, cube map textures can be layered, potentially for more iridescent effects that will substitute for bump mapping. As one contributor to Khronos' OpenGL forum noted this morning, "I just had a look on the extension, it's so much more than whatever I could have expected! I think there is a lot of developer little dreams that just happened here."
The first rollout demonstrations of OpenGL 4.0, along with its WebGL counterpart, were scheduled for late this afternoon, West Coast time. That's probably where we'll see our first screen shots of the final specification at work.
We'll also learn more about just how viable the new edition is for cross-platform development. This afternoon, another forum contributor from Montreal noted the remaining political roadblocks to true cross-platform development: "As a cross-platform developer I would like to use OpenGL exclusively but it's commercially unviable to use it on Windows, due to the fact that OpenGL just doesn't work on most machines by default, which forces me to target my game to both DirectX and OpenGL. The OpenGL shortcomings on Windows aren't a big deal for hardcore games where the users are gonna have good drivers (although they are a cause of too many support calls which makes it inviable anyway) but it's a show-stopper for casual games...Until OpenGL isn't expected to just work in any Windows box, it is dead in the Windows platform. Do something about this please."
Copyright Betanews, Inc. 2010
In today’s episode, we are going to be working with several helper functions, related to files, directories, and downloads. We are going to learn how to read, write, download files, and retrieve information about both files and directories. Also at the end we will build a small file browser that utilizes jQuery as well.
Catch UpGet the Flash Player to see this player. var so = new SWFObject('http://net.tutsplus.com/wp-content/plugins/flash-player/player.swf','player10','600','450','9'); so.addParam('allowscriptaccess','always'); so.addParam('allowfullscreen','true'); so.addParam('flashvars','&file=http://nettuts.s3.amazonaws.com/598_ci11/ci_from_scratch_day11_files_directories_downloads.mp4&bufferlength=1&skin=http://net.tutsplus.com/wp-content/plugins/flash-player/silver.swf&fullscreen=true'); so.write('player10');
Namco, one of video gaming's most iconic brands, today announced a new cross-platform game engine called UniteSDK, which will let gamers play with one another irrespective of the platform they're playing their games on.
A user playing a UniteSDK-based game on their iPhone, for example, will be able to play against a PC user, who will be able to play against a Mac user, and so forth.
"Allowing gamers with the option to play anywhere, anytime and on multiple platforms will be a true milestone for Namco Networks -- wanting to play a friend that has an iPhone when someone only has a PC will no longer be a prohibiting factor," Kirby Fong, executive producer of web development and online gaming at Namco Networks said today. "UniteSDK allows Namco and in the near future, external developers, to create games that provide cross platform and cross game social community."
Namco's first title built on UniteSDK is called Pool Pro Online 3 and will launch on PC, iPad, Mac, Android, Java, BREW, RIM and Windows Mobile. All of these platforms will be able to engage one another.
In addition to allowing interoperability, UniteSDK also gives games the ability to support achievements, records, leaderboards, gamer profiles, in-game chat, buddy lists, one-on-one challenges, and tournaments.
It's another move by a game company toward unifying the disparate platforms under a single interoperable umbrella. A similar move was made by Valve Corporation this week when it announced it will sell copies of its games for both Mac and Windows for a single price, and that all its future releases will launch simultaneously on PC, Xbox 360, and Mac.
Namco's strategy however, has much more potential for revolution in that it makes community building considerably easier. When the platform is no longer a factor that separates players from one another, a community of gamers can get together, socialize, and play much more quickly.
Copyright Betanews, Inc. 2010
With just six days to go before the National Broadband Plan is due before Congress, the Federal Communications Commission today launched a pair of consumer tools -- an app for iPhone/Android, and a Web-based reporting tool -- to help inform both consumers and the Commission itself about broadband conditions across the US.
The mobile application bundles the Ookla Speed Test (a.k.a., Speedtest.net) and Network Diagnostic Tool together into a single package simply branded "FCC Test." Users can check their downlink/uplink speeds and network latency against different US-based servers, and can then export the results as a .CSV file. The FCC says it may use the data collected from the Mobile Broadband Quality Test to analyze coverage and quality on a geographic basis across the US, but it does not endorse one particular testing application over another, so there may be more tests rolled into the app in the future.
The Commission's Broadband Dead Zone Report is much less a tool than a simple complaint dropbox. On the page, the user confirms that they do or do not have broadband available in their home, answers one related question and then provides their address. This is intended to help the FCC determine where the demand for broadband is high despite low coverage.
"Transparency empowers consumers, promotes innovation and investment, and encourages competition," said FCC Chairman Julius Genachowski in a statement today. "The FCC's new digital tools will arm users with real-time information about their broadband connection and the agency with useful data about service across the country. By informing consumers about their broadband service quality, these tools help eliminate confusion and make the market work more effectively."
Copyright Betanews, Inc. 2010
By Scott M. Fulton, III, Betanews

The nice thing about the Internet, or so I've been told, is that it has all this information. Perhaps you've noticed this lately, but the big problem has been that there's no one way to get at this information with any kind of consistency.
Supposedly Google is the "portal" for most of the world's information, which may be why so many people find Betanews by typing "Betanews" in Google. In one respect, you might expect Google to have an interest in creating that consistent methodology for getting at information. On the other hand, given that so many folks depend on Google Search just as it is now, you could see how Google might very easily come to the conclusion that there's no new benefits to be gained through improving its software, just to keep the user base it already has.
My friend and colleague Carmi Levy touched on that point this morning in Wide Angle Zoom, where he turned a reluctant thumb down on the Google Buzz social network experiment. You can call it "beta" or, as Google strangely decided this time around, not call it beta, but after using it for a while, it's difficult not to come away with the opinion that this is indeed an experiment...and you're the subject. But as Carmi also noted, different Google services are so inconsistent with one another that they may as well have been developed on different planets -- which suggests that Google may have been copying the Microsoft development model after all. Perhaps the best case-in-point example comes from Google Maps. Yesterday, to the delight of many, it added bicycle routes to its plotting options.
If you're a biker, you know that there are peculiar distinctions between the routes you plan as a pedestrian, and those you use on a bicycle. In cities whose planning commissions have added lanes to boulevards by destroying sidewalks, you know that unless you enjoy motocross and frequent encounters with beat cops, you can't plant bicycle tires on the same places you can plant your feet. I grew up decades ago in Oklahoma, at a time where for most areas of the state, "downtown" was denoted by the presence of the stoplight. Before I could drive a car, I biked four miles back and forth from my first high school, and (sometimes) the ten miles back and forth from my second, at a time when that was considered a normal way for a kid to get around town. Even then, I distinctly remember there were spans of a few hundred feet or so every so often where, if the paved road ended and the granite rock paths began, I'd pick up my bike and tread on foot between people's houses. It helped to get acquainted with them first (see: "beat cops").
The brilliance of the Google Maps experiment is that it accumulates the data that Google has gathered, not just through map scanning and satellite imagery and those strange cars you see cruising every little granite path, but through its advertising service as well. As a result, from day one, the bicycle route part of its service is capable of guiding cyclists using the tools that matter to cyclists: the landmarks they see along the way -- the gas station, the church with the tall steeple, the Italian restaurant. No service established exclusively for the purpose of mapping the world, for motorists or cyclists, would have ever assimilated information at this level of granularity; only through co-opting the advertising and location database with the mapping database could this ever be feasible from a business standpoint.
When I tested Google Maps last year as a pedestrian/public transit dependent in Los Angeles, I discovered it was using a form of "reverse tunnel logic" to compile its suggested routes. Quite literally, it would have me traveling by foot one mile south to catch a bus that would take me 1.1 miles north; and it also would have had me scaling viaducts where there were drainage ditches below and barbed wire above. I pointed out to Google at the time that Maps appeared to fail to consider time and effort consumed as factors in assimilating its routes. The response I got at the time from Google was, thank you for your input but, well, you can't know everything about everything. As I've learned from experience, yes, you can. Living in Indianapolis, for example, I know there is a kind of "superhighway" exclusively for non-motorists, formed from the brilliant idea of paving over a disused railroad track. Named for the railroad that used to own it, it's called the Monon Trail -- a 16.7-mile stretch of track that's well kept, fairly well patrolled, and is the most foot-friendly stretch of asphalt I've ever traveled.
Since it bisects most of the city north-to-south, there are a multitude of ways someone could get to the Monon Trail. Indianapolis is notable for having plenty of bike trails in certain areas of the city, and no way in hell a bike could get through in others. For my initial test of Google Maps for cyclists, I wanted to see whether it would make the same decisions I would, having lived here now for 18 years.
With pedestrian maps, Google's suggested route is plotted in blue, with the relatively foot-friendly paths outlined in solid green, or dotted green for "better than most." If I wanted to walk from my house all the way to, say, Conseco Fieldhouse downtown where the Pacers play, Google Maps would try to plot the most direct foot route it could. Even though I know for a fact that walking the Monon Trail is much, much faster than down the side of a boulevard, the fact that the Trail is a half-mile out of my way means that Google's walking map won't suggest it.
It is a very different story for cyclists, and here it's clear that someone at Google listened to my advice. It takes a little more effort to pedal west a half-mile to get to the Trail, but once you're there, the effort pays off with a four-and-a-half mile stretch of paved roads, overpasses, and relatively safe crosswalks ("zebra crossings"). Tunnel logic evidently was not used to compile this route, but rather an assessment of the time and even luxury benefits to be gained from going out of one's way -- the type of assessments Google Maps did not make last year in L.A.
Here's what I mean: This screenshot shows the suggested route from one of my favorite neighborhood pizza joints to Conseco downtown. Now, Google knows that Allisonville Road recently added a bike lane (not a good one, it's in dotted green), that it leads to a nicely protected sidewalk down Fall Creek Parkway, and that would be the most direct route downtown. Indeed, if I were a pedestrian, that's the route it would suggest. But as a cyclist, I know that's not the route I want -- crossing onto Fall Creek over Binford Blvd. means running across ten lanes of traffic without a crosswalk, where motorists are speeding through on a shortcut to I-69.
So Google Maps takes my bicycle (a vintage Takara racer, if you're interested) a mile out of my way, through a residential area, just to get me to the Monon Trail. And that's exactly right -- there's no question it's a lovelier, easier, and in good weather, faster route.
Next: Seeing where you're going, and where you shouldn't go...

Seeing where you're going, and where you shouldn't go
Perhaps the most wonderful feature of this service, which pedestrians already discovered, is the opportunity to blend Street View with maps to let you walk the route ahead of time. This way you see in advance all the landmarks you'll encounter along the way -- the waypoints that let you remember in your head what to look for and where to turn. Here is where I encountered a little bug in the program, and you can actually see it if you look closely here. Street View should show you a blue line, coordinating with the blue line in the overhead map, to let you follow the suggested route. The overhead map, shown below, appears correct -- travel west on 54th St., and turn left at the Trail. The landmark at that turn is one of my favorite Italian restaurants in all the world, Mama Carolla's. In the photograph, notice the trail runs right alongside it.

Notice also that the map's blue line has you making a left turn at Mama's onto the Trail (correct), but that Street View has you making a right turn. What happened here? A check of the turn-by-turn directions reveals that, for some strange reason, Maps wants you to travel down 54th St. for 72 extra feet, then make a U-turn, head back the other direction, and make a right turn. It's probably a little database problem, where the point of contact with the Monon Trail meets up with the street is off by a few feet. Nevertheless, if you printed off these directions so you could follow them from your bike, you'd be confused at this point.
Here's also where you discover a problem that Google can't solve, at least not right away: You can't take a Street View walk down pedestrian trails. There's an obvious reason for this: Towns don't want Google going down walking trails snapping shots of people anonymously.
The next best thing is to try to reposition yourself (the little orange man on the overhead map, who I've noticed isn't on a bike) on actual street intersections along the way. Here's where the software starts to fail: I should be able to just click on the blue path at an intersection where there's a photo. Instead, I have to drag the little man up in the air (he actually "flies" while this is happening, like a repositioned character in Peter Molyneux's game "The Movies") and deposit him in the vicinity of the blue line. Where it ends up dropping him, despite what the pointer says, could be up to three blocks out of the way.
The problem here appears to be with the front end of the program, not with the fundamental design. If you'll recall earlier my statement that you can know everything, the way you do so is by listening and learning. Google Maps is, to its great credit, capable of doing this: In cases where I know full well a certain route is safer or better than another, I can drag the blue line where I believe it should go. Not only is that an easy way for me to plan my own route, but for Google, it's a source of new information: If Google is smart about this (and there's no reason for me to believe it isn't), it will learn from my changes and those of others, and may suggest safer routes for other Maps users in the future.
But it can only do this if it gets its front end right first. The slightly incorrect portion of its suggested route for my trip downtown was a 72-foot diversion that actually does show up when you zoom in the map. But partly because the granularity of the line-dragging routine does not appear to be as fine as the map's own zoom capability, and partly because the U-turn is a three-step process which Google Maps presumes must lead from point to point to point in every circumstance, my attempt to simply shave off the U-turn in the directions was mistaken as a way for me to take a lap around the strip mall parking lot, shown here.
Because Google is leveraging its massive platform in multiple areas to provide an exclusive service that wouldn't have been feasible on its own, little adjustments can have big consequences. Someplace within the Google database right now, there's probably the recording that some Indy cyclist weirdo suggested that instead of a simple 72-foot loop around the middle of 54th St., one should take a big two-block oval around the strip mall. As long as that little route-adjustment bug is in there, the validity of information Google is gleaning from changes that sensible people are making to suggestions everywhere, may end up not being very sensible. And as a result, over time, someone will probably be advised to walk one mile north in order to get on the route that leads her 1.1 miles south.
Despite that little discovery, I can easily see where Google Maps will become an invaluable tool for bicyclists who want to explore not only their home town, but areas of the world they've never been. I can imagine a depression in car rentals across the country. I'm also imagining folks with their Android GPS-enabled phones in their pockets maybe someday getting spoken directions. "Turn left onto Monon Trail...No, silly, your other left."
Copyright Betanews, Inc. 2010
Following up on last week's beta release of Opera Mini 5 for Windows Mobile 5 and 6, Opera software today launched Opera Mini 5 for the Android platform.
With Mini 5, Opera Software has managed to make a cross-platform browser that provides an almost uniform experience across all the operating systems it runs on. Today's release on Android feels almost identical to the version I tested last week.
However, with Android, we're taking a different look at Opera and its comparisons to other browsers. It's easy to say, "Oh, Opera is faster than IE Mobile, but not as comprehensive as Skyfire," when comparing browsers on Windows Phones. Everybody does that.
Because there are four different versions of Google's mobile operating system in circulation right now, there are at least three different native Android browsers to compare Opera Mini 5 to. Android versions 1.5 and 1.6 have an older version (v. 4.0) of the Android browser, while Android 2.0 and up have a browser with a new UI and new features. Android 2.1 has the same browser as 2.0, but it is endowed with multitouch gestures.
We tested Opera Mini 5 against the two main Android browsers.
Opera Mini 5 on Android 1.5 & 1.6
For devices that run upon the "Cupcake" and "Donut" builds of Android, Opera Mini 5 provides a number of different experiences from the stock browser. First, Opera provides an actionable address bar which can just be clicked upon to enter URLs. In Android Browser 4, the user has to tap Menu > Go to bring up the address bar. Secondly, Zooming in and out with the Android browser is done with the preview tool and magnifying glass buttons, but Mini 5's is mostly pre-ordained. If you set it to "mobile view," pages are formatted to fit your screen so you don't have to do too much resizing. However, Mini 5 defaults with mobile view off and full screen mode off, so your pages are first going to load very quickly, but will require zooming (done by double-tapping the screen, a gesture that Android Browser version 4 actually lacks).
When considering Mini 5's interface alone, it's not a significant improvement over the stock browser. However there's much more to love about Opera than its UI, so we'll talk more about that later.
Next: Opera Mini 5 on Android 2.0+...
Opera Mini 5 on Android 2.0+
Devices running Android 2.0 and beyond are generally equipped with stronger processors, so browsing with the stock Android browser is a tough experience to compete with. Fortunately for Opera Mini 5, the experience it provides on these devices actually holds up quite well thanks to some of the features it adds that Android lacks across the board.
Principal among these is tabbed browsing. In all Android browsers, your browser tabs are a whole sub-screen which pulls you out of your current window and into a new one. In Opera Mini, browser tabs appear as an overlay in your main window with a rack of thumbnails that can be chosen from. This adds a lot to the feeling of continuity within Opera, and is an area where the Android browser suffers.
Another major complaint about the Android browser is that it does not sync your mobile bookmarks with anything. They're currently something of a dead end. This has been a big argument in favor of the Dolphin browser, which offers that feature. Even better, however, is Opera Mini 5, which actually can sync to your desktop version of Opera with Opera Link. So if you're a desktop Opera user, not only will your Speed Dial screen be automatically populated, but it also gives you instant access to your bookmark folders and RSS feeds.
The final issue to mention when talking about any of Opera's products is the addition of server-side rendering. Pages in Opera Mini 5 are digested on an Opera server before they hit your device's screen, so browsing is sped up considerably. Though browsing on a 3G connection is enjoyable on all Android devices, Opera Mini 5 can knock out pages appreciably faster.
So what's the bottom line on this beta?
It's a "Must Have" if:
You're a desktop Opera user using Android 1.5 or 1.6.
It's a "Must Try" if:
You're in an area with poor 3G coverage using Android 1.5 or 1.6.
For everyone else, it will be worthwhile to play around with it and see if you like what Opera does. After all, it is the most popular mobile browser in the world.
Opera Mini 5 beta can be downloaded today in the Android Market.
Copyright Betanews, Inc. 2010
I see a number of questions regularly about module bootstraps in Zend Framework, and decided it was time to write a post about them finally.
In Zend Framework 1.8.0, we added Zend_Application, which is
intended to (a) formalize the bootstrapping process, and (b) make it
re-usable. One aspect of it was to allow bootstrapping of individual
application modules -- which are discrete collections of controllers, views,
and models.
The most common question I get regarding module bootstraps is:
Why are all module bootstraps run on every request, and not just the one for the requested module?
To answer that question, first I need to provide some background.
Tumblr’s popularity over the last year has increased exponentially. The reason why is quite simple: Tumblr is flexible, powerful, and, most importantly, a pleasure to work with. Unfortunately, there aren’t many training resources available for the platform yet. In this video series, we’ll go through the process of taking a Tumblr theme, designed in Photoshop, and converting it into a fully working theme – in just a few hours.
To take advantage of this mammoth video series, become a Premium member!
Watch the IntroGet the Flash Player to see this player. var so = new SWFObject('http://net.tutsplus.com/wp-content/plugins/flash-player/player.swf','player10','600','450','9'); so.addParam('allowscriptaccess','always'); so.addParam('allowfullscreen','true'); so.addParam('flashvars','&file=http://nettutsplus.s3.amazonaws.com/60_tumblr/Chapter 1 - Intro.mp4&bufferlength=1&skin=http://net.tutsplus.com/wp-content/plugins/flash-player/silver.swf&fullscreen=true'); so.write('player10');
The Full Series
Thanks to Kate Payton for submitting the design for this tutorial.
Join Net Premium
For those unfamiliar, the family of TUTS sites runs a premium membership service. For $9 per month, you gain access to exclusive premium tutorials, screencasts, and freebies from Nettuts+, Psdtuts+, Aetuts+, Audiotuts+, and Vectortuts+! For the price of a pizza, you’ll learn from some of the best minds in the business. If you’re curious about the other Premium tutorials that we have available, check here. Join today!
If you’re a book lover, you may have noticed that the vast majority of book-related websites out there leave a bit to be desired when it comes to design and information architecture. In fact, some author and publisher websites make me feel like my eyes might bleed!
But there are some gems out there, and we’ve collected some of the best. If you know of any other fantastic book-related websites, whether they’re for authors, individual books, publishing companies, or blogs, let us know in the comments.
Authors & Individual Book SitesAuthor websites are some of the more challenging sites to design. If an author has a large backlist, it can be difficult to figure out how to showcase all of their work effectively. And if the author has only published one or two books, it can be hard to have an effective site that doesn’t feel empty.
And in reality, there are a lot of things an author’s site needs to accomplish. It needs to provide readers and potential readers with information about the books and why they might be interested in reading them. It needs to give booksellers information about the books, and why they should stock them. And it needs to act as a constant promotional tool that will help the author sell more books and gain more fans.
Dear Author has a great post on what many author websites are lacking. The list includes things like a printable book list, a link on the home page to contact the author, and a highly visible “coming soon” section. Check out the full list for more points to keep in mind if you’re designing an author’s website.
Here are a few great author and book websites you should be sure to check out for inspiration and ideas.
No One Belongs Here More Than You
This is one of the most creative books websites I’ve ever seen. While it’s not the most user-friendly of sites, it suits its purpose and does well to hold reader interest.
Justine Larbalestier
An excellent, clean-looking design that still has plenty of character. Her books are prominently displayed on the home page, along with links to her blog, about information, and other important parts. She also includes information about events, interviews, and specific book info on the home page, a big plus for readers and book sellers.
Stephen King
Stephen King’s presents its own challenges to a designer, mainly the sheer volume of information it needs to contain. King has written well over sixty books, has had a number of his books adapted for the screen, and has written numerous short stories. But his site manages to include all the pertinent information a visitor might be looking for while also showcasing his best and most recent works, all while maintaining a very streamlined and professional design.
Cherry Adair
Cherry Adair’s website fits well with the types of books she writes. The only downside to the site is that it’s entirely Flash-based, though the interface itself is slick and very responsive. She includes all of the information one would expect on an author site, including a printable, PDF booklist.
Jim Collins
Jim Collins’ site takes a much more minimalist design approach than many of the others on this list. The color scheme is limited and sophisticated, there’s plenty of white space, and only necessary content is included.
Jean Chatzky
Jean Chatzky’s website is well-suited to the types of books she writes and the brand she’s built for herself (you may recognize her from her regular appearances on the Today Show). It’s professional but unintimidating and has a friendly feel to it. It also provides all the necessary information you’d expect and is easy to navigate.
Hank Phillippi Ryan
Hank Phillippi Ryan’s website is bright and colorful, which matches the covers and style of her books. The layout is reminiscent of a grid layout and makes good use of negative space.
Caroline Tiger
Caroline Tiger’s site has some of the best use of color of any author site I’ve seen. Navigation is simple and straightforward, the emphasis is placed squarely on her books, and the overall impression is professional but relaxed.
Nicholas Sparks
Nicholas Sparks’ website makes great use of large background images and transparency. It’s easy to find the information you might be looking for, with prominent links to his books and movies, as well as appearances and biography information.
PublishersPublisher websites have to be many things to many people; not always an easy task to do well. They have to showcase their books to potential readers. They have to appeal to booksellers and convince them to stock more of their books. They have to give information to prospective authors, either in the form of submission guidelines or guidelines that tell them they don’t accept unagented submissions. They have to provide information to the media and book reviewers. And sometimes, in the case of the larger publishing conglomerates, they also have to present a united front across multipe imprints.
The best publisher sites showcase recent books as well as best sellers. They make it easy for readers and booksellers to make decisions regarding book purchases. And they provide all the necessary information about the company, the books, and the authors for anyone looking.
Here are some of the best book publisher websites out there. They run the gamut from small publishers with only a handful of books to large publishing houses that publish hundreds of titles each year. What they all have in common is good information architecture, a clean style, and excellent user experience.
Dragon International Independent Arts
The DIIArts site packs a lot of information into a small space while maintaining an uncluttered and clean-looking layout. Their main nav includes nine tabs while still leaving some breathing room. The use of icons throughout the site helps to unify everything, as does the light color scheme.
Arcadia Publishing
Arcadia Publishing’s site fits its business perfectly. It has a vintage feel to it, which fits them since they’re publishers of historical nonfiction. The site is easy to navigate and effectively showcases important information (like the fact that they offer free shipping).
Melville House Publishing
The Melville House Publishing website has a simple blue and white theme throughout. It has a minimalist, grid-based layout nad a lot of white space. Information is easy to find and their books are displayed prominently.
Princeton Architectural Press
Princeton Architectural Press’s website is great because it’s design is a bit unexpected. The bright yellow background and grid-based layout are visually striking, which is entirely appropriate for a publishign company that focuses so heavily on design, but also a bit unexpected for a site in such a conservative industry.
Penguin Group USA
Among all of the big-name publishers out there, Penguin has one of the most attractive websites. Their layout is well-ordered, the color palette is refined, and they place emphasis where appropriate. There’s a ton of information on the site, and yet it feels uncluttered.
Timber Press
The Timber Press website makes great use of color and has a fantastic layout. The design is eye-catching and easy to navigate, with a well-implemented slideshow showcasing some of their books on the home page.
Llewellyn
Llewellyn’s website uses a muted color palette and three column layout that creates a sophisticated and professional feel to their site. They make it easy to browse their books, as well as to find other information about the company and their authors.
Storey Publishing
Storey Publishing is another company that opted for a muted color palette and simple layout. The green accents on the site fit well with the country-living and outdoor-themed books they publish, as do the graphics throughout the site.
Gibbs Smith
Gibbs Smith makes great use of Flash to showcase books on their home page, but otherwise keeps their layout fairly simple. They emphasize their best-sellers but make it easy to browse their entire catalog or find information about their authors. The red, burgundy and gray color scheme is sophisticated and feels very neutral.
Other SitesPublisher and author websites aren’t the only sites out there that target book lovers. There are communities for readers (and writers), blogs and book review sites, and service sites for readers and writers alike.
The sites below target many different demographics, but each focuses on great user experience and simple architecture. Each has its own distinct style that adds to the user’s overall impression of the site and the company or people behind it. And each one has a clear purpose and mission that they accomplish well.
IndieBound
IndieBound is a community for independent bookstores and their customers. Their site is well-laid-out, has a great color scheme, and a unique design. They have a lot of information on the site, but it remains easy to navigate and find the information you need. They even manage to make the wide variety of graphics used on the site appear cohesive.
The Fiction Project
The Fiction Project at Art House Co-Op has a really awesome site design. The overall look represents the artistic sensibility of the project, but all information about the project is easily found and legible.
Lulu
Self-publishing company Lulu has a well-designed website that focuses on user experience. They keep graphics simple and use them specifically to highlight their services. The color scheme is consistent (white, blue and orange), and there’s plenty of negative space in the design. What sets Lulu’s site apart from many other self-publishing sites is that they’ve made it just as easy for book buyers to use the site as they have for authors.
Readerville
Readerville uses a simple two-column design with brownish-orange, burgundy, and muted blue accent colors. Readability is given the utmost importance in this design, with usability a very close second. While the site is no longer updated, it is still a great example of a book-related site design.
DailyLit
DailyLit, a service that delivers daily reading to your email inbox, has a fantastic website that uses a muted, cool color palette and grid-based layout. The site is easily navigated and showcases their services and the books available.
Blurb
Blurb is another self-publishing service that puts more emphasis on style than many other self-publishing sites. They offer good user experience for both authors and book buyers, and showcase “staff picks” on the home page (something many self-publishing companies don’t bother with).
The Millions
The Millions is a book review and culture site that uses a grid layout and mostly-black and white color scheme with bright orange accents. The layout of the site is fantastic, and the entire thing feels very modern and refreshing.
Guys Read
Guys Read is a literacy site for boys that places a heavy emphasis on typography. The site uses a red-white-and-blue color scheme and plenty of white space. It uses a mostly two-column layout and has a very masculine feel to it without feeling stuffy or staid.
I’ve just uploaded the slides from my confoo.ca talk “Making software management tools work for you”. You can download the slides from here.
Thanks again to everyone who attended! Please give me feedback on joind.in.
Tuning a webserver in three minutes while it's being slashdotted.
In jQuery 1.3, the team introduced the live() method, which allows us to bind event handlers to elements on the page, as well as any that might be created in the future dynamically. Though not perfect, it definitely proved to be helpful. Most notably, live() bubbles all the way up, and attaches the handler to the document. It also ceases to work well when chaining method calls, unfortunately. Delegate() was introduced in version 1.4, which almost does the same thing, but more efficiently.
We’ll examine the specific differences between the two methods in today’s video quick tip. Thanks to the FireQuery Firebug extension, we’ll have the tools to more easily understand how each method functions.
<ul id="items"> <li> Click Me </li> </ul>
// Bind attaches an event handler only to the elements
// that match a particular selector. This, expectedly,
// excludes any dynamically generated elements.
$("#items li").click(function() {
$(this).parent().append("<li>New Element</li>");
});
// Live(), introduced in 1.3, allows for the binding
// of event handlers to all elements that match a
// selector, including those created in the future.
// It does this by attaching the handler to the document.
// Unfortunately, it does not work well with chaining.
// Don't expect to chain live() after calls like
// children().next()...etc.
$("li").live("click", function() {
$(this).parent().append("<li>New Element</li>");
});
// Delegate, new to version 1.4, perhaps should have been a complete
// replacement for Live(). However, that obviously
// would have broken a lot of code! Nonetheless,
// delegate remedies many of the short-comings
// found in live(). It attaches the event handler
// directly to the context, rather than the document.
// It also doesn't suffer from the chaining issues
// that live does. There are many performance benefits
// to using this method over live().
$('#items').delegate('li', 'click', function() {
$(this).parent().append('<li>New Element</li>');
});
// By passing a DOM element as the context of our selector, we can make
// Live() behave (almost) the same way that delegate()
// does. It attaches the handler to the context, not
// the document - which is the default context.
// The code below is equivalent to the delegate() version
// shown above.
$("li", $("#items")[0]).live("click", function() {
$(this).parent().append("<li>New Element</li>");
});
Conclusion
This can definitely be a confusing topic. Please feel free to ask questions, or discuss within the comments. Thanks so much to Elijah Manor for clarifying a few things for me on this topic!
PEAR consists of literally hundreds of packages (libraries) that help you to build your PHP applications faster, less error-prone and more secure. Millions of web applications use and rely on the proper functioning of PEAR packages.
To ensure constant quality, many packages utilize phpt or PHPUnit tests that are run during development and before each release. They help us making sure new features or bug fixes do not break existing functionality.
One of hard to solve challenges is ensuring that a package's unit tests do not only run on the specific PHP version the developers have installed on their machines (which often is the latest and greatest, maybe not even released version from SVN), but to cover the whole range of supported PHP versions. This goal can be achieved in several ways:
Solution number 1 requires either much hardware or at least quite some setup time for virtual machines. Besides that, running tests regularly on many different machines needs automated deployment tools - you won't ssh into the 15th machine manually, let alone setting up database servers and other software that might be required.
There is no single Linux distribution I know of that supports installing multiple versions of PHP beside each other - making solution number 2 similar daunting to setup and running as #1. The benefits above #1 are obvious: All software on one machine means easier deployment because the software to test needs to be setup only once. Software dependencies need to be installed only once. Executing the tests is easier if all versions of PHP are on this single machine, which means that the cross-version tests can be automated really easily.
A tool to solve all problems with the multiple-php-versions-on-one-machine solution is phpfarm. The best way to demonstrate its easiness is probably a shellshot:
$ svn co [svn.php.net] phpfarm $ cd phpfarm/src $ ./compile 5.3.2 ... fetching sources from php.net ... configuring ... compiling ... installing ... fetching and setting up pyrus $ php-5.3.2 --version PHP 5.3.2 (cli) (built: Mar 10 2010 18:08:27) (DEBUG) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies $ pyrus-5.3.2 --version Pyrus version 2.0.0a1 SHA-1: 2FDFB5E00A6D707437DBC047AAF9D115C6484D90 Using PEAR installation found at /home/cweiske/Dev/cvs/pear/phpfarm/inst/php-5.3.2/pear php pyrus.phar version 2.0.0a1.
That's it. With one single command, you can install each version of PHP you like, and you get pyrus, the next-generation PEAR installer for free! Let's try it:
$ pyrus-5.3.2 channel-discover pear.phpunit.de Discovery of channel pear.phpunit.de successful $ pyrus-5.3.2 install phpunit/phpunit ... Installed pear.phpunit.de/PHPUnit-3.4.11 $ pyrus-5.3.2 list-packages Listing installed packages [/home/cweiske/Dev/cvs/pear/phpfarm/inst/php-5.3.2/pear]: [channel pear.phpunit.de]: PHPUnit
phpfarm automatically sets up your php.ini with the values you desire. It sets your include_path. It lets you specify custom configuration options, per patch, minor or major PHP version - just have a look at the README.
Now everything is ready for you (and us PEAR developers!) to let the unit tests run on all the little PHP versions we want to. Did I tell you that phpfarm also installs php-cgi versions? My next blog entry will show you how to run dozens of php versions simultaneously in apache.
If you have questions or suggestions about phpfarm, don't hesitate to ask on the pear-general mailing list (subscription info) or on the #pear IRC channel.
Happy testing!
I’ve been working hard on Goodsie.com lately trying to bring it to launch. It’s been great being in on a new PHP project from (near) the beginning, as it frees up a number of things.
One of those, is the fact that I can be using PHP 5.3 and all the new features that come with PHP 5.3. While I’ve used my fair share of the short-cut ternary already (?:), the bigger win for me, are the Lambda functions with scoping (anonymous functions).
I found a very specific use out of the blue of Lambda functions that I have now used and I see as a great use-case. Which is specifically passing functions/logic from your Controller to your View.
In the case of Goodsie, I’m using PHP for my templating language and as usual I’m trying to remove as much logic from my View as possible, while still allowing the view to be malleable.
The specific case I had, was a subview that was generating some pagination code for me. You know, the standard ‘previous, page 1, page 1, next’ section of links. The basic html template I had, looked looked similar to:
<div class="pagination">
<a href="<?= $baseurl . '/page:' . ($page - 1) ?>">← Previous</a>
Page <?= $page ?> of <?= $total ?>
<a href="<?= $baseurl . '/page:' . ($page + 1) ?>">Next →</a>
</div>
Rather straight forward, but I quickly ran into a problem. The way it worked, as you see, is that you passed in a base URL, and the page number you are currently on, and it generated appropriate forward/back links. (Ok, there was also some other logic where it determined if you needed the prev/next links at all, but I’ve removed that for clarity)
But I then had a case, where I wanted to reuse this subview in an ajax situation. Where instead of straight URL’s being passed in, I might want to pass in a javascript function, and have that function be called with the page number as a parameter. That would be nice as I could use it in both situations. What pagination looked like, could completely change, and still work on both cases. Perhaps we’d want to give a full list of all possible pages. Or show a couple forward/back, etc. The view could handle all of that without a change to the controller.
But therein lied the problem. When using a URL based pagination, I wanted to concat the page number onto the end of the URL. But when using javascript, it wasn’t pure concatenation, it instead needed to wrap the page number with the function call. Oh the pain a simple ) could cause me.
I started writing code, where I ended up with tons of switch statements and logic inside of the view. I’d have to pass in two different possible values, a URL or a javascript function. The view at every point where it would output a link, would need to see which version was being used, and from that decide what type of output to create. In short, it was a mess.
But then the solution dawned upon me. A lambda function would work admirably here. So what I did, is inside of my controller I created a function on the fly, that would generate the appropriate type of link that I was wanting. It looks something like:
if ($jsfunc) {
$url = function ($p) use ($jsfunc) { return "javascript:{$jsfunc}({$p})"; };
} elseif ($baseurl) {
$url = function ($p) use ($baseurl) { return "{$baseurl}/page:{$p}"; };
}
Now I could simply rewrite my original template, to use this lambda function $url to generate it’s URLs.
<div class="pagination">
<a href="<?= $url($page - 1) ?>">← Previous</a>
Page <?= $page ?> of <?= $total ?>
<a href="<?= $url($page - 1) ?>">Next →</a>
</div>
Now not only would this work for my specific situation, but ANY controller could reuse this pagination subview and define exactly how it wanted it’s URLs to be formed. Now, the view could completely change around how the pagination section is displayed, show as many, or as few pages as it wants to, and all that without ever touching the controller.
This is one simple example, but I’ve become enamored of this approach. Using lambda functions in this way, you are able to have complicated logic represented inside of your view, but encapsulated/created by the controller. Also of note is the fact that the view is managing to use the $jsfunc and $baseurl values, but without actually having to be granted access to them. This allows for another level of encapsulation, as I exposed one function,
Truncated by Planet PHP, read more at the original (another 1389 bytes)
Qaiku, the conversational microblogging service that launched a year ago had a refresh that launched today. While it hasn't yet convinced the twittering masses, it has already proven itself as a lot more thoughtful platform for the Finnish online community, and as a valuable workstreaming tool.
The new version looks quite nice and fresh. Notice the privacy information on the right-hand side, which is relevant as Qaiku allows channels and profiles that are private or invitation-only:

Technically the new version is also remarkable as it is the first major website to run fully on top of the legacy-free Midgard2 platform. So yes, every entry you see there is a GObject. And D-Bus signals fly when you post.
On to the challenge, thenTo highlight Qaiku's threading, conversational nature I started a new "On my travels, I have" thread for sharing your most extraordinary travel experiences. This is not on Twitter or Buzz as with Qaiku it is so easy to keep the conversation together and accessible for the future as well.
To contribute, sign up on Qaiku, go to the thread and add your experiences as a comment. If you have a link or picture to include, you can also do so. My first entry was:
seen ice descend from the heavens and provide us with cold beer on a hot day in Lesotho
Will be interesting to see what comes out of this :-)
I'm doing a talk today in the Bossa Conference about using Midgard as a content repository for mobile applications. As part of my presentation I wrote some simple example code for using the Midgard APIs in Python, and thought they would be good to share to those not attending the event as well.
The idea of a content repository is that instead of coming up with new, isolated file formats or database setups for your application you can just work with objects and signals, and let Midgard handle the rest. This is something that lots of people are doing with CouchDB as well, but we feel Midgard, with its light footprint and native APIs for languages like Python, C, Vala and PHP fits better in the mobile applications context.
Installing MidgardMidgard packages are available for many different Linux distributions through the OpenSuse Build Service. To find the right repository for your setup, go to the OBS project page. For example, on my Ubuntu Karmic netbook the URL to add to apt sources.list is deb [download.opensuse.org] ./. Then I just:
sudo apt-get update sudo apt-get install python-midgard2
Midgard is also available in Maemo extras and for OS X on MacPorts.
Defining a schemaThe first thing when developing a Midgard application is to define your storage objects. This is done using the MgdSchema XML format. In this case we're doing a simple "attendee" object that amends Midgard's built-in person record with information related to the conference:
<?xml version="1.0" encoding="UTF-8"?>
<Schema xmlns="http://www.midgard-project.org/repligard/1.4">
<type name="openbossa_attendee" table="openbossa_attendee">
<property name="id" type="unsigned integer" primaryfield="id">
<description>Local non-replication-safe database identifier</description>
</property>
<property name="person" type="unsigned integer" link="midgard_person:id">
<description>Person attending the event</description>
</property>
<property name="registration" type="datetime">
<description>Registration date of the attendee</description>
</property>
<property name="likesbeer" type="boolean">
<description>Whether the attendee likes beer</description>
</property>
</type>
</Schema>
Then we just save this XML file into /usr/share/midgard2/schema/ so that Midgard will find it.
Once the MgdSchema is in place it is time to import antigravity and start hacking in Python. The code works pretty much in the same way in other languages Midgard is available for, but Python is used here for the sake of simplicity. First we load the Midgard extension:
import _midgard as midgard
Then we setup the repository connection. With these settings we will store our content into an SQLite database located in ~/.midgard2/data/midgardexample.db:
configuration = midgard.config() configuration.dbtype = 'SQLite' configuration.database = 'midgardexample' # Open a Midgard repository connection with our config connection = midgard.connection() connection.open_config(configuration)
As this is the first time we're interacting with the repository we need to tell Midgard to prepare the storage for itself and also for our new openbossa_attendee class:
midgard.storage.create_base_storage()
midgard.storage.create_class_storage('midgard_person')
midgard.storage.create_class_storage('midgard_parameter')
midgard.storage.create_class_sTruncated by Planet PHP, read more at the original (another 2314 bytes)
Repetitive tasks can quickly become tedious. As a designer, you probably often find yourself designing the same elements over and over from scratch. STOP!
Wasting time is so old-fashioned. It also means you’re wasting money! So, let’s review some ways that you can automate and systematize your Photoshop workflow. And be sure to download the project base for all of your new designs!
File Tree & Re-usable Project Base
The first step in systematizing your workflow is to organize your files. Identify all common elements you use within your designs.
You may come to a list such as the following:
Consider how your final deliverables are used. If they are shipped to a coding business, be as organized and thorough as possible, including notes and fonts where applicable.
You can ensure that you have perfectly organized themes by creating a package that allows you to “fill in the blanks”, so to speak. Simply copy this folder, assign it to the project by renaming it to the project and get working. This is a very simple and efficient way to work, and means that websites you built four years ago can easily be edited, because everything is packed into its very own place.
In the zip file, you’ll find a simple re-useable template starting point. This file contains elements such as dividers, buttons and a pre-gridded template to speed up your design workflow.
See how simple starting a new project is now? It may take a couple of minutes to set-up, but the time saved later is more time for you to be doing what you love best – designing!
Now that we have a solid base to build upon, we can starting filling out our ‘boiler-plater’ with specific files and concepts.
Web Template
The sample template will allow you to create a page of your most used elements, ready for quick inclusion in your latest project.
If you’re a web designer in particular, you’ll find that a lot of your projects, even those different in every possible way – use and re-use common elements.
Begin by building a few re-usable templates. Don’t worry about which elements you wish to include just yet, because you can always go back and look at your previous projects and analyze more popular features – then re-create them here.
Personally, I use just one template. I have a home page (this contains elements such as news bulletins, blog post stylings, menus, logos and call to actions). I can modify this template to suit blog pages, buy it now forms and more.
The page also has a 960.gs pre-applied. This has been included for download at the end of the article, in the template boilerplate.
Once you’re set-up with this concept, you can build designs very quickly. However, you should definitely consider developing your own, and tailor it to your clients and team. You could go further by adding icons, search elements and online store related items – anything to suit your client base.
Grouping & Organizing
The above image demonstrates the tangible difference between an organized layer palette, and a messy one!
When you’re in a real creative flow, it can be difficult to stop and start naming and grouping layers. Photoshop doesn’t really help in this area by default either!
So, take the time as you go to name and group layers. This will help you later when coding the design, or if you ship if off for coding elsewhere.
Name each layer, and try to use a descriptive and short word – such as ‘menu’ for the navigation. Group specific areas, such as the header or a contact form.
This has a two-fold benefit.
So, take the time to stop every five minutes or so, and name and group each element. You’ll be glad you did!
Make good use of the select tool! You can toggle the select mode between layers and groups. This facilitates mass updating and re-aligning designs, so don’t forget it!
Actions
If you don’t use actions in your work-flow, then you should begin using them immediately.
Photoshop actions are entirely configurable lists of actions Photoshop should carry out automatically. You can create your own, or choose from the bounty available online. If you work on Photographs for example, and have 400 pictures to edit and resize, this would take a long time. Instead, you can create an action that adjusts the contrast, alters the size and then saves the file in .jpg format, blasting through 400 files in seconds! You must use actions!
If you do not have the knowledge, or experience to create your own actions, GraphicRiver has a large selection of actions available for purchase from $1!
The actions on sale range from simple photo effects to this action which can add various pre-formatted text sections such as contact details or blog posts in seconds.
Start using Actions and you will notice a significant increase in your productivity and reduce the amount of times you need to repeat monotonous tasks over and over.
Creating and Using an ActionMaking your own action is easy. As an example, we’ll create a simple action to re-size several images at once, then save them.
First off, you need to hit the new action button, on the actions palette.
You shouldn’t need to change any settings as standard, bar changing the name for better organization. Photoshop is now recording your actions. So, all you need to do is re-size the image. Go to image size, and alter the dimensions. The action will change any image to these dimensions. Then hit save.
Finally, press stop on the action palette.
Now, when you press play on the action you’ve created, Photoshop will follow the list of defined actions on your image. Although very simple, an action such as this one could save you hours of monotonous resizing photos and images. This is only a very simple look at actions. They can do so much more, so take your time to get to know them and really use them. The beauty of them is in how you can record basically any action in Photoshop – selecting, changing styles, transforming, re-sizing and saving.
iPhone & UI DesignDo you work with user interfaces? If so, you really need to download a GUI element pack for Photoshop.
There are many available for most popular operating systems and mobile platforms.
For example, if you work with the iPhone, you can download the iPhone GUI pack that contains all elements available in the iPhone interface library, and then simply start designing your app. Simple, quick and much easier than attempting to create these from scratch.
Android GUI Kit
Teehan Lax Kits
The agency, Teehan Lax have several high quality, life-like UI kits. These are great for building an iphone app sales site, or designing the actual UI of an app. Kits are available for the iPhone, Palm Pre and Browsers.
Palm Pre
iPhone
Browser Elements
Conclusion
I hope we’ve given you some tips that you can use to improve your productivity and efficiency. Photoshop is a wonderful tool, but, if we’re not careful, we can find ourselves repeating the sames tasks over and over. So be sure to implement the above tips and start saving time, money and your sanity!
Download the Project Base
Do you have any Photoshop time-saving tips? Have any ideas on other tasks that could be automated to save time and repetition? Feel free to share them with the community via the comments.
Which CMS does The Real Story Group Use? (Tony Byrne / CMS Watch):
The answer is, we use an open-source platform called "Midgard." We picked it nearly ten years ago, and it has held up fairly well.
...
One of the things we like about Midgard actually makes it rather unsuitable for many simpler publishing scenarios: it is highly object-oriented. This allows us to run multiple sites off largely a single codebase -- at the cost of quite user-unfriendly administrative and authoring facilities.
Also, Midgard is very much a development platform, and we have had to create a fair amount of custom code, especially to handle structured content. In that regard, our CMS experience probably resemble yours. As an industry we remain very far from plug-and-play content management technology for all but the simplest of websites.
While the post contains many negative points about older Midgard (the UIs are a bit better now than they used to be, quite a lot of development has since been happening especially in the LTS branch), it is remarkable that CMS Watch has been able to run their services through the same CMS setup for ten years. This really shows the durability and commitment to long-term stability we have in the Midgard community. We've been doing this for more than ten years, and will likely keep going for quite a bit longer.
As for usability and popularity of Midgard, there is quite little we can do about it in the Midgard1 area, as that is now in long-term support phase that won't allow major changes. But Midgard2 is a new world with new opportunities. Midgard's content repository is pretty much there already, as is the MVC layer, and this spring we should be able to unveil the new, quite revolutionary CMS concept as well. Watch this blog for updates!
Over the weekend, Elijah Manor tweeted about a new IDE, called WebStorm, that is currently being offered as a public preview, from JetBrains. After spending a few hours with it, I’m extremely impressed! In this video quick tip, I thought I’d show you some of my favorite features that you, frankly, just don’t see much in other code editors.
Watch on your iPhone Notable FeaturesSo, if you’re curious, take some time to look over WebStorm and let me know what you think! I’m still learning it too, so let me know if you found any cool features that I didn’t mention.
jQuery is not always as it appears. There's a lot of cool stuff going on under the surface, and there are many methods just waiting to be discovered, and many potential usages of jQuery's API that you may not have considered before. In this article I'll be taking you through a few of the not-so-obvious things I've discovered about jQuery.
1. Understand jQuery!When you call 'jQuery' what happens?
The jQuery function itself is very simple:
jQuery = function (selector, context) {
// The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init(selector, context);
};
Under its skin, the jQuery function (commonly referred to as the "wrapper" function) simply returns an instantiated jQuery object — i.e. an instance of the 'jQuery.fn.init' constructor.
This is useful to know; with this information we know that each time we call 'jQuery' we're actually creating a totally unique object with a set of properties. jQuery is clever in that it gives you an object that can be treated as an array. Each of your elements (all together, commonly known as the "collection") is referenced within the object under a numerical index, just like within an array. And jQuery also gives this object a 'length' property, just as you would expect from an array. This opens up a world of possibilities. For one, it means that we can borrow some functionality from 'Array.prototype'. jQuery's 'slice' method is a good example of this — modified from the source:
/* ... jQuery.fn.extend({ ... */
slice: function() {
return this.pushStack(
Array.prototype.slice.apply( this, arguments ),
"slice",
Array.prototype.slice.call(arguments).join(",")
);
},
/* ... */
The native 'slice' method doesn't care that 'this' is not a real array– it'll be fine with anything that's got a 'length' property and [0], [1], [2] etc.
There are some other interesting properties within this jQuery object — '.selector' and '.context' will, most of the time, reflect the arguments that you pass into 'jQuery(…)'.
var jqObject = jQuery('a');
jqObject.selector; // => "a"
One thing that's important to note is that jQuery will sometimes give you new jQuery objects to work with. If you run a method that changes the collection in some way, such as '.parents()', then jQuery won't modify the current object; it'll simply pass you a brand new one:
var originalObject = jQuery('a');
var anotherObject = originalObject.parents();
originalObject === anotherObject; // => false
All methods that appear to mutate the collection in some way return a brand new jQuery object — you can still access the old object though, via '.end()', or more verbosely, via '.prevObject'.
2. Bread-and-butter Element CreationCentral to jQuery's DOM capabilities, is its element creation syntax. 1.4 brought with it an entirely new way to create your elements quickly and succinctly. E.g.
var myDiv = jQuery('<div/>', {
id: 'my-new-element',
class: 'foo',
css: {
color: 'red',
backgrondColor: '#FFF',
border: '1px solid #CCC'
},
click: function() {
alert('Clicked!');
},
html: jQuery('<a/>', {
href: '#',
click: function() {
// do something
return false;
}
})
});
As of 1.4 you can pass a second argument to the jQuery function when you're creating an element — the object you pass will, for the most part, act as if you were passing it to '.attr(…)'. However, jQuery will map some of the properties to its own methods, for example, the 'click' property maps to jQuery's 'click' method (which binds an event handler for the 'click' event) and 'css' maps to jQuery's 'css' method etc.
To check out what properties map to jQuery's methods, open your console and type 'jQuery.attrFn'.
3. Serialize your InputsjQuery provides a method that you can use to serialize all of the inputs within one or more forms. This is useful when submitting data via XHR ("Ajax"). It's been in jQuery for a long time but it's not often talked about and so many developers don't realise it's there. Submitting an entire form via Ajax, using jQuery, couldn't be simpler:
var myForm = $('#my-form');
jQuery.post('submit.php', myForm.serialize(), function(){
alert('Data has been sent!');
});
jQuery also provides the 'serializeArray' method, which is designed to be used with multiple forms, and the 'param' helper function (under the jQuery namespace) which takes a regular object and returns a query string, e.g.
var data = {
name: 'Joe',
age: 44,
profession: 'Web Developer'
};
jQuery.param(data); // => "name=Joe&age=44&profession=Web+Developer"
4. Animate Anything
jQuery's 'animate' method is probably the most flexible of jQuery's methods. It can be used to animate pretty much anything, not just CSS properties, and not just DOM elements. This is how you would normally use 'animate':
jQuery('#box').animate({
left: 300,
top: 300
});
When you specify a property to animate (e.g. 'top') jQuery checks to see if you're animating something with a style property ('element.style'), and it checks if the specified property ('top') is defined under 'style' — if it's not then jQuery simply updates 'top' on the element itself. Here's an example:
jQuery('#box').animate({
top: 123,
foo: 456
});
'top' is a valid CSS property, so jQuery will update 'element.style.top', but 'foo' is not a valid CSS property, so jQuery will simply update 'element.foo'.
We can use this to our advantage. Let's say, for example, that you want to animate a square on a canvas. First let's define a simple constructor and a 'draw' method that'll be called on every step of the animation:
function Square(cnvs, width, height, color) {
this.x = 0;
this.y = 0;
this.width = width;
this.height = height;
this.color = color;
this.cHeight = cnvs.height;
this.cWidth = cnvs.width;
this.cntxt = cnvs.getContext('2d');
}
Square.prototype.draw = function() {
this.cntxt.clearRect(0, 0, this.cWidth, this.cHeight);
this.cntxt.fillStyle = this.color;
this.cntxt.fillRect(this.x, this.y, this.width, this.height);
};
We've created our 'Square' constructor, and one of its methods. Creating a canvas and then animating it couldn't be simpler:
// Create a <canvas/> element
var canvas = $('<canvas/>').appendTo('body')[0];
canvas.height = 400;
canvas.width = 600;
// Instantiate Square
var square = new Square(canvas, 70, 70, 'rgb(255,0,0)');
jQuery(square).animate({
x: 300,
y: 200
}, {
// 'draw' should be called on every step
// of the animation:
step: jQuery.proxy(square, 'draw'),
duration: 1000
});
This is a very simple effect, but it does clearly demonstrate the possibilities. You can see it in action here: [jsbin.com] (this will only work in browsers that support the HTML5 canvas)
5. jQuery.ajax Returns the XHR ObjectjQuery's Ajax utility functions ('jQuery.ajax', 'jQuery.get', 'jQuery.post') all return an 'XM [HttpRequest'] object which you can use to perform subsequent operations on any request. For example:
var curRequest;
jQuery('button.makeRequest').click(function(){
curRequest = jQuery.get('foo.php', function(response){
alert('Data: ' + response.responseText);
});
});
jQuery('button.cancelRequest').click(function(){
if (curRequest) {
curRequest.abort(); // abort() is a method of XM [HttpRequest] }
});
Here we're making a request whenever the 'makeRequest' button is clicked — and we're cancelling the active request if the user clicks the 'cancelRequest' button.
Another potential usage is for synchronous requests:
var myRequest = jQuery.ajax({
url: 'foo.txt',
async: false
});
console.log(myRequest.responseText);
Read more about the 'XMLHttpRequest'">[HttpRequest">'XMLHttpRequest'] object and also be sure to check out jQuery's Ajax utilities.
6. Custom QueuesjQuery has a built-in queuing mechanism that's used by all of its animation methods (all of which use 'animate()' really). This queuing can be illustrated easily with a simple animation:
jQuery('a').hover(function(){
jQuery(this).animate({paddingLeft:'+=15px'});
}, function(){
jQuery(this).animate({paddingLeft:'-=15px'});
});
Quickly hovering over a bunch of anchors and then hovering over them again will cause the animations to queue up and occur one at a time — I'm sure many of you have witnessed this queuing effect before. If not, check it out here: [jsbin.com]
The 'queue' method is similar to the well-known 'each' method in how it's called. You pass a function, which will eventually be called for each of the elements in the collection:
jQuery('a').queue(function(){
jQuery(this).addClass('all-done').dequeue();
});
Passing just a function to 'queue' will cause that function to be added to the default 'fx' queue, i.e. the queue used by all animations done by jQuery. Therefore, this function will not be called until all current animations occurring on each element in the collection (in this case, all anchors) have completed.
Notice that we're adding a class of 'all-done' in the function above. As outlined, this class will only be added when all current animations are complete. We're also calling the 'dequeue' method. This is very important, as it will allow jQuery to continue with the queue (i.e. it lets jQuery know that you're finished with whatever you're doing). jQuery 1.4 provides another way of continuing the queue; instead of calling 'dequeue', simply call the first argument passed to your function:
jQuery('a').queue(function(nextItemInQueue){
// Continue queue:
nextItemInQueue();
});
This does exactly the same, although it's slightly more useful in that it can be called anywhere within your function, even within a mess of closures (that typically destroy the 'this' keyword). Of course, pre-jQuery-1.4 you could just save a reference to 'this', but that would get a bit tiresome.
To add a function to a custom queue, simply pass your custom queue's name as the first argument and the function as the second:
jQuery('a').queue('customQueueName', function(){
// Do stuff
jQuery(this).dequeue('customQueueName');
});
Notice that, since we're not using the default 'fx' queue, we also have to pass our queue's name to the 'dequeue' method, in order to allow jQuery to continue with our custom queue.
Read more about 'queue', 'dequeue' and 'jQuery.queue'.
7. Event NamespacingjQuery provides a way for you to namespace events, which can be very useful when authoring plugins and third-party components. If needed, the user of your plugin can effectively disable your plugin by unbinding all event handlers that it's registered.
To add a namespace when registering an event handler, simply suffix the event name with a period and then your unique namespace (e.g. '.fooPlugin'):
jQuery.fn.foo = function() {
this.bind('click.fooPlugin', function() {
// do stuff
});
this.bind('mouseover.fooPlugin', function() {
// do stuff
});
return this;
};
// Use the plugin:
jQuery('a').foo();
// Destroy its event handlers:
jQuery('a').unbind('.fooPlugin');
Passing just the namespace to 'unbind' will unbind all event handlers with that namespace.
ConclusionSo which ones did I miss? Any helpful features that you feel jQuery doesn’t document well enough? Let’s discuss in the comments!
The DNA tests that revealed how the famed boy-king Tutankhamun most likely died solved another of ancient Egypt's enduring mysteries — the fate of controversial Pharaoh Akhenaten's mummy. The discovery could help fill out the picture of a fascinating era more than 3,300 years ago when Akhenaten embarked on history's first attempt at monotheism.

Also available is this Leather Case with Magnetic Flap for iPhone 3G / 3GS for $8.49 before coupon code "EFWS030827", $6.49 after. With free shipping, that's another price low.

The FCC Wants You to Test Your Broadband Speeds wired.com
DSL Still Tops Broadband Market Share, Says ABI cable360.net
Kaspersky calls for international internet government v3.co.uk
AT&T CEO Calls For 'Light Touch' Regulations advfn.com
Time Warner Cable Phasing Out Sprint VoIP multichannel.com
Buying bandwidth in the app store theregister.co.uk
Will Verizon 4G Mean the End of "All You Can Eat" Data? pcworld.com
Cox Business lands state contracts in Va. cedmagazine.com
Why the FCC National Broadband Plan Should Include Public Wi-Fi pcworld.com
FCC Scammed Out Of Millions In Telco Scam techdirt.com
ComScore: Motorola, BlackBerry rule U.S. market fiercewireless.com
read comment(s)
Note: for the installation, you'll need to call and make an appointment at your nearest Best Buy.
Of note, Hollister (Abercrombie's sister store) offers $50 gift cards for every $150 you spend online, as we listed earlier today. Shipping starts at $8.95 and sales tax is added where applicable. The gift card will arrive in the mail and must be redeemed by April 30 as well.

France of course was one of the first countries to impose laws that require ISPs terminate the service of users who repeatedly engage in copyright infringement. Surprising, well, nobody, Torrent Freak points out since France's new antipiracy law was passed last September, piracy has continued to rise. A new study published by the University of Rennes indicates that piracy has risen in France 3%, with users having to only slightly vary their online habits:This increase in piracy shows that the French are not changing their downloading habits much, despite the tougher legislation. There is, however, an interesting shift in the sources people use to download copyrighted movies and music. At an increasing rate the French are using streaming services along with file-hosting cyberlockers such as Rapidshare and Megaupload.The law of course doesn't cover direct download sites, and so the use of BitTorrent dropped 7.1% to 14.6% as users migrated to direct downloads and Usenet. Again, French critics continue to charge that instead of playing this game of perpetual whack a mole, the industry should be focusing on offering cheap, compelling, DRM-free alternatives.
In line with other studies, the French study also found that half of all P2P users who download copyrighted content also buy digital content online -- meaning that by kicking them off of the Internet -- both ISPs and the entertainment industry are losing customers.
read comment(s)
The country may have started its long haul back to economic recovery — if recent news that consumer spending increased slightly in January is any indication.

Also available are the Puma Women's Complete Magnetist III Road Running Shoes in Azealea Pink/Silver/Black for $51.93 after an in-cart discount plus $8.99 for shipping, another price low. They're available in sizes 6 to 11.
Every time I visit the grocery store, I’m amazed to see how much of the fresh produce aisle is taken up with prepackaged fresh foods. You know what I’m talking about – bags of prewashed lettuce, pre-cut apples, pre-cut celery, pre-cut pineapple, and so on.
I understand why such items are for sale – they’re convenient. It’s easier to just grab a bag of prewashed romaine lettuce than it is to grab a head of romaine and deal with it when you get home.
Yet, when you look at the prices, you’re actually paying a significant markup. Two bags of Dole romaine lettuce at my local grocer costs about the same as a single head of romaine. The bags cost about $4.50 together, while the head costs about $1.60 (with some variance, of course, due to weight, sales, and so on). By buying the head, you save $2.90 – or, from a different perspective, you’re paying $2.90 for the convenience of someone else washing your lettuce.
Is that really worth it? I bought a head of romaine lettuce myself, put it in one of those handy bags that they provide, and took it home with me. Upon arriving home, I set a stopwatch for myself, then chopped the leaves off of the head of lettuce, rinsed them thoroughly, rinsed the bag a bit (leaving some moisture inside), then put the leaves back in the bag, tying it. I then tossed the knife in the dishwasher and stopped the stopwatch.
Total time? Three minutes. Actually, it was just a bit shy of that.
Let’s say over the course of the next year, I repeat the same action twenty times. I buy a head of romaine, put it in one of those bags from the store, take it home, chop it myself, and store it in that bag. Each time, I’m saving myself $2.90. Over the course of a year, I spend an hour chopping up the lettuce and save myself a total of $58.
The same holds true for all of those convenience foods.
Apple slices? I found apples I like at the store for $1.29 a pound, whereas pre-sliced apples added up to $4.76 a pound (I found four four-ounce bags of them for $1.19 each). I have a nice little apple slicer, so I’m able to slice up a few apples at dinnertime and completely clean up from it in about thirty seconds. My estimate on this is that buying un-cut apples saves me about $80 for every hour of apple-slicing I’m willing to do.
Celery sticks? I can buy a bag of celery for $1.49 or I can buy about three containers of pre-sliced sticks for $1.99 each. I spend about four minutes cutting the sticks and it saves me $3.47 – or about $52 over the course of a full hour.
I can go on and on with these items, but in each case the central idea is true: the convenience has a really, really high cost, much more than it might seem at first glance.
To me, this type of convenience food is a perfect example of how the little things really add up when it comes to personal finance. There are so many little conveniences that we pay for in life, whether it’s pre-sliced apples or take-out food or a lawn care service. When you actually step back and calculate the hourly rate that these things are costing you, it’s truly astounding. Yet people fill their lives with these conveniences and question those who skip out on them, then they wonder why it’s challenging to make ends meet.
Take a stand today. Slice your own vegetables. Then put that saved money aside for something for yourself.

Earlier this week we noted how a Judge in Illinois had issued a 47-page report claiming that Verizon's sale of their DSL and landline networks in the state would be both bad for consumers, and bad for Frontier. According to Judge Lisa Tapial, the $8.5 billion deal (which would immediately infuse Frontier with nearly 6 million new voice and broadband connections) "will diminish Frontier s ability to perform its duties to provide adequate, reliable, efficient, safe and least-cost public utility service." Frontier has issued a press release that unsurprisingly argues that the Judge doesn't know what she's talking about:Today s proposed order by an ALJ in Illinois ignores the numerous public interest benefits outlined in the complete record developed in the Frontier/Verizon transaction. . . Frontier has been a leading provider of telecommunications services to Illinois customers for a decade, and during this time we have demonstrated our ability to meet our commitment to providing quality service. Without any regulatory mandates we have deployed broadband availability to more than 90 percent of our footprint in Illinois. "We hope to deliver these same broadband benefits to even more consumers in Illinois as soon as possible."It's not clear what "numerous public benefits" Frontier's referring to, given Judge Tapial's point was that the Verizon deal infuses Frontier with so much debt -- they may not be able to provide any. Meanwhile, it's not exactly as if Frontier is lighting it up in the territories they serve now. Our Frontier user reviews are thoroughly average, the carrier isn't offering next-generation speeds (most users are served with 3 Mbps or less), and just a few years ago the carrier was considering applying a 5GB cap on all DSL tiers.
Which "numerous public benefits" are we talking about, exactly?
read comment(s)
Note: A 90-day warranty applies, although it's unclear who supports it.
Note that no warranty information is provided.
Note: if the links above do not work, copy "http://www.lenovo.com/spp" and paste it into your web browser.
The DNA tests that revealed how the famed boy-king Tutankhamun most likely died solved another of ancient Egypt's enduring mysteries — the fate of controversial Pharaoh Akhenaten's mummy. The discovery could help fill out the picture of a fascinating era more than 3,300 years ago when Akhenaten embarked on history's first attempt at monotheism.