PINGV Creative Blog Feed http://pingv.com/blog/featured/laura/200509/when-a-website-is-a-car-not-a-taxi en Square Grid responds for Drupal 7 http://pingv.com/blog/square-grid-responds-for-drupal-7 <p>From the get-go, Square Grid has been intended to offer less. Sometimes less is more, especially so when it comes to front-end web development.</p> <p><a href="http://drupal.org/project/squaregrid" title="Square Grid Theme for Drupal 7">Square Grid</a> is a Drupal 7 base theme<a href="#footnote">*</a> leveraging the design and implementation power of <a href="http://thesquaregrid.com" title="Square Grid framework by Avraham Cornfeld">Square Grid</a>, combined with principles of responsive design. It's been in active development, with new features and the odd bug fix pushed live periodically over the past several months. Here's where the theme stands now.</p> <h3 id="moreoptionsstilllightweight">More options, still lightweight</h3> <p>Since its first incarnation, Square Grid has <a href="http://drupal.org/node/995308/commits" title="display of code commits to the project git repository">grown a bit</a> – not so much in code but rather in flexibility. It's still pretty lightweight.</p> <h4 id="configurabletoolsinclude">Configurable tools</h4> <p>Square Grid configuration options are inherited and available to your child theme's settings page. These include:</p> <h5>Configurable responsiveness options</h5> <p>Responsive support has been part of the theme since April. Now you can configure whether you want it, and if so how much.</p> <p class="image-teaser_full"><img src="http://pingv.com/f/imagecache/teaser_full/blogimgs/sg-settings-responsivetoggle.png" alt="squaregrid config screen" title="" class="imagecache-teaser_full" /><br /> <span class="image-caption">You can turn the responsive support on and off.</span></p> <p>However, it's not just a matter of turning responsive support on or off: You have various options.</p> <p class="image-teaser_full"><img src="http://pingv.com/f/imagecache/teaser_full/blogimgs/sg-settings-responsive.png" alt="squaregrid config screen detail" title="If responsive support is enabled, you can choose what grid sizes to enable." class="imagecache-teaser_full" /><br /> <span class="image-caption">If responsive support is enabled, you can choose what grid sizes to utilize in the theme.</span></p> <p class="image-teaser_full"><img src="http://pingv.com/f/imagecache/teaser_full/blogimgs/sg-settings-nonresponsive.png" alt="squaregrid config screen detail" title="If you do not want responsive support, you can choose a universal grid size for all screens." class="imagecache-teaser_full" /><br /> <span class="image-caption">If you do not want responsive support, you can choose a universal grid size for all screens.</span></p> <p>The theme does only what you've planned for.</p> <h5>Internet Explorer options</h5> <p>You can decide how to handle Internet Explorer up through version 8, which does not recognize media queries.</p> <p class="image-teaser_full"><img src="http://pingv.com/f/imagecache/teaser_full/blogimgs/sg-settings-ie.png" alt="squaregrid config screen detail" title="IE support options can be configured as well." class="imagecache-teaser_full" /><span class="image-caption">IE support options can be configured as well.</span></p> <p> Options include one static grid size, or no special handling (in case you want to use a JavaScript-based solution such as Respond.js).</p> <h5>Simple built-in development aids</h5> <p>Grid-based theme development sometimes can get quite involved when working on an actual Drupal codebase, not just mockups or prototypes. </p> <p class="image-teaser_full"><img src="http://pingv.com/f/imagecache/teaser_full/blogimgs/sg-settings-devtools.png" alt="squaregrid config screen" title="" class="imagecache-teaser_full" /><span class="image-caption">From Square Grid-enabled theme configurations.</span></p> <p>With these seettings, you can toggle on/off display of the actual grid and rebuilding the theme registry on every pageload.</p> <h4 id="behindthesceneswhatyougetare">Behind the scenes, what you get are:</h4> <h5>A grid for most occasions</h5> <p class="image-teaser_full"><img src="http://pingv.com/f/imagecache/teaser_full/blogimgs/squaregrid-grids-concise.png" alt="Square Grid grid" title="The lightweight Square Grid Theme builds off of the powerful flexibility of Square Grid framework by Avraham Cornfeld." class="imagecache-teaser_full" /><br /> <span class="image-caption">As illustrated here, Square Grid framework facilitates a wide variety of design grids, from 4-column to 12-column to Golden Ratio, all from one grid schema.</span></p> <p>The lightweight Square Grid Theme builds off of the powerful flexibility of <a href="http://thesquaregrid.com" title="Square Grid framework by Avraham Cornfeld">Square Grid framework by Avraham Cornfeld</a>. See <a href="http://thesquaregrid.com" title="http://thesquaregrid.com">http://thesquaregrid.com</a> for more on Square Grid concepts, templates and more.</p> <h5>Lightweight CSS</h5> <p>The styles predefined in the theme are as minimal as possible, focusing only on page layout. The idea is that you, the themer or front-end developer, will want to control the rest.</p> <h5>Mobile first architecture</h5> <p>The theme styles for single-column, optimized-for-smaller-screens layout first, and adds multi-column grid-based layouts <em>in addition</em> for screens 770px and larger.</p> <h5>Content-first page loading</h5> <p>Nothing irks more than loading secondary content before the main content. It makes people wait longer to see what they clicked to see, raising click-aways. This theme loads your main content first, <em>then</em> the secondary content.</p> <h5>Straightforward grid column settings</h5> <p>These can be overridden in your child theme's template.php. No heavy PHP knowledge is required, and all necessary code is provided. </p> <h5>No extra extras</h5> <p>It's tempting to add more bells and whistles, but the goal is not to add complexity or steepen your learning curve with bespoke variables or code concepts.</p> <p>There's more on these features and characteristics in the <a href="http://drupal.org/node/1264768">official documentation</a>.</p> <h3 id="notafluidgrid">Not a fluid grid</h3> <p>Square Grid is not a fluid grid. Why? Because even today <a href="http://www.webmonkey.com/2010/12/why-percentage-based-designs-dont-work-in-every-browser/" title="Why Percentage-Based Designs Don’t Work in Every Browser">browsers do not agree how to render out elements defined with floating decimals</a>. A fluid 35-grid layout would require a grid of %2.857... per grid square, which means that a fluid layout defined by percentages would entail added complexity and possibly some browser hacks, especially when you multiply browser-imposed roundings and truncations by 35.</p> <p>Some people still prefer 100% fluid layouts, and that can make sense, especially in some use cases, such as an expert-interface dashboard requiring as much screen-estate as possible. However, if the static grid widths adapt to the screen sizes, the marginal benefits of going 100% fluid are somewhat minimized. Therefore, given the floating point issues noted above, Square Grid, as a base theme, supports multiple fixed-grid widths that offer healthy screen-estate usage for the most-commonly used screen sizes. (Count me in the school of thought that <a href="http://www.zeldman.com/2011/07/06/responsive-design-i-dont-think-that-word-means-what-you-think-it-means/">it's all responsive</a>.) An added benefit is that, by defining these break points, the theme renders with more predictability for design purposes. The current 770px-, 980px- and 1190px-width break points in Square Grid Theme cover most larger displays, while still providing comfortable, readable layouts. As screens get larger, we can build upon this paradigm. And we're not ruling out fluid grid definitions altogether. (See below.)</p> <h3 id="roadmapitems">Road map items</h3> <p>Here are some things in the works (in no particular order):</p> <h4>An HTML5 version</h4> <p>This is already in the works. [<a href="http://drupal.org/node/1149168">Meta issue</a>]</p> <h4>"Nav last" page structure</h4> <p>Currently, Square Grid loads the main menu before the content — something I always immediately remake in any child theme. While there are still some naysayers, most agree that loading nav last is best practice for mobile display. This means that Square Grid should load the nav last, just before the footer. How this gets styled for proper placement, though, depends very much on the specifics of the design. That's why I have not done this yet, but I may add 3-4 lines of CSS to handle this. [<a href="http://drupal.org/node/1276578">Issue</a>]</p> <h4>Configuable column widths</h4> <p>These would be configurable "sidebar" widths settings, to make it easier for you to just get on with implementing your design. (Column widths are fully workable in the theme currently, but customizing them does involve some code editing to change integer values in the child theme's template.php file.) [<a href="http://drupal.org/node/1276650">Issue</a>]</p> <h4>1400px-wide layout</h4> <p>This has been partially implemented (and disabled in code pending completion) and likely will be in one of the next releases. [<a href="http://drupal.org/node/1262622">Issue</a>]</p> <h4>Fluid layout</h4> <p>Comments above notwithstanding, this could be an option with potential appeal to some themers. Caveats about variable browser support would apply, of course. [<a href="http://drupal.org/node/1276814">Issue</a>]</p> <p>We hope Drupal users working to implement custom designs on their own sites find the <a href="http://drupal.org/project/squaregrid" title="Square Grid Theme for Drupal 7">Square Grid Theme</a> useful.</p> <p>--</p> <p id="footnote"><em><strong>*</strong> For most themers and front-end developers, one of the fastest paths to implementing a completely custom design for Drupal is via a base theme. For more about this approach, <em>see</em> <a href="http://drupal.org/node/225125">the Drupal.org documentation on this architecture</a>.</em></p><div class="field field-type-nodereference field-field-related"> <div class="field-label">Related:&nbsp;</div> <div class="field-items"> <div class="field-item odd"> <a href="/blog/grok-drupal-7-theming-update">Grok Drupal 7 Theming - update</a> </div> <div class="field-item even"> <a href="/blog/on-grids-in-design-and-announcing-the-square-grid-drupal-theme">On grids in design (and announcing the Square Grid Drupal theme)</a> </div> <div class="field-item odd"> <a href="/blog/floater-theme-to-get-away-from-columns">Floater Theme to get away from columns</a> </div> </div> </div> http://pingv.com/blog/square-grid-responds-for-drupal-7#comments design Drupal Drupal 7 Drupal theming HTML5 Internet Explorer mobile responsive design Square Grid theme Tue, 13 Sep 2011 13:27:53 +0000 Laura Scott 146 at http://pingv.com Upgraded to Drupal 7: Salesforce, Homebox, Stock API, Hierarchical Select http://pingv.com/blog/upgraded-to-drupal-7-salesforce-homebox-stock-api-hierarchical-select <p>For us, every project starts with goals. From goals comes strategy, from strategy comes planning (information architecture, interaction design, technical architecture) and from planning comes (a rather agile) implementation.</p> <p>And for implementation, 2011 so far is the year of Drupal 7 — at least it has been for us, because all of the projects we've started this year have implementation powered by Drupal 7 at the core. In some ways, we love Drupal 7 so much more than Drupal 6, we don't like to look back. It's almost painful to have to deal with Drupal 6 anymore … especially when it comes to theming. </p> <p>Of course, this means we've had to do quite a bit of wrangling with module bugs, helping with upgrade-related issues, and contributing our own upgrades. Despite the success of the <a href="http://drupal.org/project/modules?solrsort=sort_title%20asc&amp;text=d7cx&amp;display=table">#D7CX initiative</a>, the first several months of Drupal 7 contrib felt like life on the bleeding edge. That's only natural for such a large and robust system as Drupal has become.</p> <p>Some of the modules we upgraded to Drupal 7 include:</p> <p class="image-teaser_full"><img src="http://pingv.com/f/imagecache/teaser_full/blogimgs/d7modules.jpg" alt="SalesForce module and other modules" title="Our view is that the best way to upgrade existing Drupal modules is to contribute the work back to their Drupal.org projects." class="imagecache-teaser_full" /><br /> <span class="image-caption">Our view is that the best way to upgrade existing Drupal modules is to contribute the work back to their respective Drupal.org projects. This way the client benefits from having more code supported by the Drupal community. We benefit by having extra eyeballs and keyboards working the challenges, as well as ensuring that the client's project remains on the open source path.</span></p> <h3><a href="http://drupal.org/project/salesforce">Salesforce</a></h3> <p><em>[Ported to Drupal 7, still in active development.]</em></p> <p>With a project making very heavy use of quite deep Salesforce integration with Drupal, we had to get the Salesforce Suite into Drupal 7 shape. We've made quite a lot of progress. Yet this is a huge undertaking, and much is yet to be done. Check out the <a href="http://drupal.org/project/issues/salesforce?text=&amp;status=All&amp;priorities=All&amp;categories=All&amp;version=1198576&amp;component=All">issue queue</a>. For a sense of what's next and priorities, see the <a href="http://drupal.org/node/1214126#comment-4714500">Salesforce Suite for Drupal 7 roadmap</a>. (We'll have more on Salesforce integration with Drupal 7 in another post.)</p> <h3><a href="http://drupal.org/project/homebox">Homebox</a></h3> <p><em>[Available now for Drupal 7. Seeking (co-)maintainer(s).]</em></p> <p>You may know it as "Your Dashboard" on Drupal.org. It was available in Drupal 6, but we needed it for Drupal 7, so we did the upgrade to a minimum viable product release. Homebox is available for your Drupal 7 project!</p> <p>We don't have an internal need to push it further, but Homebox has tons of potential, especially for site managers and administrators. If you're interested in extending and improving Homebox, please share your patches, or even help <a href="http://drupal.org/project/issues/homebox?text=&amp;status=8&amp;priorities=All&amp;categories=All&amp;version=7.x&amp;component=All">review patches already submitted</a>. <em>Maybe you'd even like to be co-maintainer?</em></p> <h3><a href="http://drupal.org/project/stockapi">Stock API</a></h3> <p><em>[Available now for Drupal 7. Seeking (co-)maintainer(s).]</em></p> <p>Need a block to display stock prices? We ported the module from Drupal 6 to <a href="http://drupal.org/node/1198114">7</a>. It's still a -dev release, but fairly stable at the moment. At this point, we don't need to take it further. Future maintainer(s) interested in building out a cool set of stock-market-monitoring features are welcome to take up the baton from here.</p> <h3><a href="http://drupal.org/project/hierarchical_select">Hierarchical Select</a></h3> <p><em>[Available now for Drupal 7.]</em></p> <p>Goodness knows this module faces a huge rearchitecting for Drupal 7, but we needed something working right away, so we've been working with maintainer <a href="http://drupal.org/user/99777">Wim Leers</a> to get a minimum viable product released. There's <a href="http://drupal.org/project/issues/hierarchical_select?text=&amp;status=All&amp;priorities=All&amp;categories=All&amp;version=7.x&amp;component=All">a lot more that could be done for HS</a>, but at least it's available for Drupal 7 now, and I'm sure Wim would appreciate more loving community attention on this incredibly useful usability enhancer.</p> <h3>Oops, that's a cul-de-sac</h3> <p>One project we did that is now pretty much EOL is Apache Solr Pages. We needed the functionality for a project at the time, and Solr did not have it and there was no clear roadmap as to when or even whether it would have it, so we contributed this simple project. Now <a href="http://drupal.org/project/apachesolr">Solr</a> itself provides that functionality, so this project turned out to be not needed.</p> <h3>The commons</h3> <p>In fighting the bleeding edge, we <a href="http://drupal.org/node/1244116">discovered a bug in, and rolled a patch to fix, the Aggregator module in Drupal core</a>. (The patch was then adapted/modified by other community contributors to work on Drupal 8 first, for subsequent backporting. As I write this, it's ready to be committed, so it will hopefully be in a Drupal 7 point release very soon. Isn't open source great?) We also offered some small help in the issue queues on a number of contrib projects. It took a lot of work from this great community to bring Drupal to where it is now. We're glad to do our own small part.</p> <p>That's the way of the commons. We consider it our responsibility to our clients to fix and update modules this way. The whole idea of using open source is that you adopt code that is shared by the worldwide community. If you don't share the fixes, not only is the community diminished as a result, you've also created your own fork that you, or your client, will be stuck maintaining alone. That's what we would call a bad strategy. Share in the commons and everyone benefits — the community, your client, you.</p> <h3>D7 to get you through these dog days</h3> <p>Every time a new major Drupal release hits the interwebs, there's a bit of debate over when that new release is ready for production use by site builders and owners, and it almost always comes down to the state of contrib. This summer, Drupal 7 contrib has really started to stabilize, with solid releases to many of the popular and useful modules out there. From our perspective, it would take some huge convincing to get us to consider Drupal 6 now for any new project, because Drupal 7 is coming of age and ready for its day in the sun. Not only that, compared with Drupal 6, Drupal 7 will have 1-3 years' more community support (barring an unexpectedly short Drupal 9 release cycle).</p> <p>With such a large Drupal community, and the amazing proliferation of new module and theme projects, thanks to <a href="http://drupal.org/community-initiatives/git">Drupal.org's new Git footing</a> and the easy ability to create project sandboxes, it can be challenging to keep up with what's happening, or to even be aware of things that may be an awesome fit for your needs. There's simply too much Drupal community development activity to keep track of these days. This post is a little highlight of things we've been working on that you may find interesting, useful or even worthy of your support. I hope other shops, freelancers and hobbyists post about their work as well. It's a busy Drupal world. Shine some light on what you're doing!</p><div class="field field-type-nodereference field-field-related"> <div class="field-label">Related:&nbsp;</div> <div class="field-items"> <div class="field-item odd"> <a href="/blog/laura/200702/how-to-use-open-source-and-how-not-to">How to use open source (and how not to)</a> </div> <div class="field-item even"> <a href="/blog/drupal-disruptive-open-source-part-i-from-brobdingnag-to-lilliput">Drupal Disruptive Open Source: Part I — From Brobdingnag to Lilliput</a> </div> </div> </div> http://pingv.com/blog/upgraded-to-drupal-7-salesforce-homebox-stock-api-hierarchical-select#comments Drupal Drupal 7 Drupal development Hierarchical Select module Homebox module open source SalesForce Stock API module Wed, 17 Aug 2011 00:17:41 +0000 Laura Scott 144 at http://pingv.com When will Drupal 8 be released? http://pingv.com/blog/when-will-drupal-8-be-released <h3>When will Drupal 8 be released?</h3> <p>When will Drupal 8 be out? It's a question that's asked in many forms. </p> <p>Sometimes it's phrased as: when will I have to upgrade from Drupal 6? Or, how long will Drupal 7 be supported?</p> <p>Laura Scott and I were reviewing <a href="http://sf2010.drupal.org/conference/sessions/state-drupal.html">Dries Buytaert's 2010 State of Drupal</a> and the estimates on when the new Drupal release candidate would be virtually frozen. The graph below is his summary graph of the trends in April 2010.</p> <p class="image-teaser_full"><img src="http://pingv.com/f/imagecache/teaser_full/blogimgs/state-of-drupal-april-2010-release-graph.png" alt="Dries Buytaert" title="Fig 1 April 2010 Prediction of Drupal Release" class="imagecache-teaser_full" /><br /> <span class="image-caption">Fig 1 — Dries Buytaert's April 2010 Prediction of Drupal Release.</span></p> <p>It turned out that the trends were not linear, and it was Laura who suggested that bug fixes aren't linear: they tend to be hyperbolic or (for fellow math majors) follow "power functions" that have a logarithmic aspect to them.</p> <p>This got us thinking. What is the history of time between Drupal releases (TBDR)? In the slide below, Dries provided some this data in his slide from the State of Drupal at the <a href="http://buytaert.net/state-of-drupal-presentation-march-2011" title="Dries&#039; blog">March 2011 Drupalcon Chicago</a>.</p> <p class="image-teaser_full" id="drupalsize"><img src="http://pingv.com/f/imagecache/teaser_full/blogimgs/state-of-drupal-april-2010.png" alt="Dries Buytaert" title="Fig 2 March 2011 graphic Drupal code size" class="imagecache-teaser_full" /><br /> <span class="image-caption">Fig 2 — Dries' March 2011 graphic showing Drupal's code size historically.</span></p> <p>All that was missing were the dates, which Laura looked up from the Changelogs of each Drupal n.0 release, and from this I created the graph below, which is consistent with a power function. That is, geometric!</p> <p class="image-teaser_full"><img src="http://pingv.com/f/imagecache/teaser_full/blogimgs/TBDR-Years-v.-Size-20110722.png" alt="PINGV Creative" title="Fig 3 TBDR of core size versus release dates; Kate Lawrence" class="imagecache-teaser_full" /><br /> <span class="image-caption">Fig 3 — TBDR of core size versus release dates. Graph by Kate Lawrence.</span></p> <p>What this means is that the more the code, the longer it takes, and in this case (at least thus far) it is obeying a consistent pattern. Interestingly, in the period from of Drupal 4.0.0 to Drupal 4.6.0, the size of Drupal was pretty constant, especially as compared to the recent growth of Drupal core ... and <em>the TBDR was about 6 months!</em> What do today's longer release cycles mean for Drupal? I say this only because we are hearing that Joomla has a <a href="http://www.joomlablogger.net/blog/joomla-news/joomla-17-stable-released-one-click-update-from-165/" title="Joomla announces turn around schedule">6 month time horizon</a> between releases.</p> <h3>If Developers were Horses...</h3> <p>What would it look like to have 90 developers contributing, only contributing really, really fast? Is there a marginal utility curve, like we learned in Econ 200, in there someplace? That is, at what point do you have so many people involved, that they are tripping over one another? Throwing more people at the problem does not get quicker results, and may in fact, slow things down. cf. <a href="http://en.wikipedia.org/wiki/The_Mythical_Man-Month" title="Wikipedia Article">The Mythical Man Month.</a></p> <p>The Mythical Man Month premise is: Assigning more programmers to a project running behind schedule will make it even later.</p> <p>So a question to ponder is to what extent can the growth curve in the above slide be changed?</p> <p>The final slide from Dries that I think is relevant to this pattern appears below. </p> <p class="image-teaser_full"><img src="http://pingv.com/f/imagecache/teaser_full/blogimgs/D7Patches8020.png" alt="Dries Buytaert" title="Fig 4 30 contributors responsible for 50% of D7 Patches; Dries Buytaert" class="imagecache-teaser_full" /><br /> <span class="image-caption">Fig 4 — 30 contributors were responsible for 50% of D7 Patches. Graphic by Dries Buytaert.</span></p> <p>Most of us have heard of the "<a href="http://en.wikipedia.org/wiki/Pareto_principle" title="Wikipedia article">80/20 Rule</a>." The rule is attributed to the findings of Italian economist Vilfredo Pareto. Sometimes its the 90/10 Rule or 95/5 Rule, or even 920/30 rule (see Figure 4)!</p> <p>The challenge may be in making the ski-jump curved line more linear (while pinning the line on the y-axis). The more linear it becomes, the steeper the TBDR curve's slope becomes — meaning that <a href="http://buytaert.net/how-i-think-about-drupal-release-date-planning">releases</a> can be more rapid.</p> <p>In short, holding the intersection point on the left axis, as the graph becomes more linear, the faster the TBDR. The challenge we face as individuals within the community is <a href="http://groups.drupal.org/drupal-initiatives">helping in making that happen</a>.</p><div class="field field-type-nodereference field-field-related"> <div class="field-label">Related:&nbsp;</div> <div class="field-items"> <div class="field-item odd"> <a href="/blog/drupal-disruptive-open-source-part-i-from-brobdingnag-to-lilliput">Drupal Disruptive Open Source: Part I — From Brobdingnag to Lilliput</a> </div> </div> </div> http://pingv.com/blog/when-will-drupal-8-be-released#comments Drupal Drupal 7 Drupal 8 project management Thu, 21 Jul 2011 17:25:57 +0000 Katherine Lawrence 143 at http://pingv.com Our virtual team toolbox http://pingv.com/blog/our-virtual-team-toolbox <p>Everyone does virtual differently. Having worked in bricks-and-mortar previously, setting up a virtual work system as been something of a mix of experimentation with solutions recommended by others. Here are some of the ways we manage as a virtual company.</p> <h3>Client communications</h3> <p>Email is a place to lose things. We don't depend upon email for critical project communications. We have <a href="http://pingv.com/blog/open-atrium-and-iterations">our own Open Atrium intranet</a> set up for all of our clients. Here we post research documents, wireframes, flow charts, use cases, design mockups, questions, general messages, and the ever essential support tickets. Our clients can post, comment on and otherwise interact with all of these items, and all the archives are there for review later. No spam filters or non-inbox-zero obstacles!</p> <h3>Team communications</h3> <p>What can I say? We like <a href="http://skype.com">Skype</a>. It's stable, it's pretty much peer-to-peer, it is very good at drilling through firewalls, it's encrypted, it stores archives, we can do conference calls, share screens, etc. That said, we are eyeing other possible solutions, including <a href="http://plus.google.com">google+</a>. The main need is to have robust real-time chatrooms, with encryption, and easy voice communications.</p> <h3>Ticket/time tracking</h3> <p>Like most design and development companies, we've been pretty frustrated with a lot of the project management software solutions out there. We use <a href="https://app.liquidplanner.com/signup_a/197/8b0f76e9013600f64f3ac66f188e99525b7945c6">Liquid Planner</a> (affiliate link), which provides ticket-level time tracking, high/low estimation, schedule and cost projections, and some nice graphs. And unlike some other systems, we've had no problems with performance slowdowns — it's a fairly consistently moderately fast web app, given its complexity. Having tried Basecamp, Harvest, Unfuddle, Freshbooks, ActiveCollab, Trac, Jira, Rally and several desktop apps over the years, I think Liquid Planner is the closest thing to the bee's knees.</p> <h3>Design process</h3> <p>We meet with the client if at all possible. We talk. We draw pictures. We point at things. We work to understand the client as best we can. This means travel, if there's room in the budget. It ends up paying off in the end through implementation of a project better aligned with the client's needs. When not in person, we communicate through Atrium.</p> <p>As for amongst ourselves, we use <a href="http://db.tt/a6Ddfi7">Dropbox</a> (affiliate link for extra GBs of space) as an easy way to share physical files that are not suited for version control. And we talk in Skype. Sometimes we'll do mark-up on artwork or wireframes, but most of the creative collaboration happens via voice. It's somehow more human that way.</p> <h3>Code repository</h3> <p>Like many, we use GitHub. Can I just take a moment here to say how much I love Git? Escaping from Subversion was transformative. (Drupal.org's escaping from CVS will be even more so.) The biggest problem with svn is all those hidden folders. They're like pox riddled throughout your code, buried in each folder, lurking. Replace a folder with a fresh one and svn freaks out, "What did you do with my hidden folder, you malfeasant!" Git doesn't do this. Git is nice. Swap out things in your code and Git doesn't mind. Git loves it when you do things like that. Go ahead, swap out a folder, swap out 10 folders! Tell Git and Git says, "Got it!" Shiny!</p> <h3>Development and staging</h3> <p>Configure globally, code locally. As soon as we start the first development sprint for a project, we set up a staging server on a VPS. Right now we are really liking <a href="http://www.linode.com/?r=59437d49c3535e8867e9ce452c6a324ac170ddd5">Linode</a> (affiliate link) for the smaller sites and AWS for the bigger ones requiring more flexibility on resources. Each of us codes locally, on our own machines, merging our code changes with Git. We deploy committed changes several times a day to the staging server using Git pulls from GitHub, which serves as our canonical central repository. Configuration changes, with the exception of Featurized configurations, are all done on the staging site, so that we don't have to mess with database conflicts. (Bricks-and-mortar teams can all connect to one canonical database on the same network, but that just won't work for virtual teams. The latency is not just fatal, it's fatal on a mass extinction scale.) We periodically pull database backups from the staging site to use locally, so we're all referencing the same basic configurations.</p> <p>The exceptions to this relate to Features and exportables. We love Features, but find that they can get in the way at times. We use them for special cases, especially when doing iterative development, where it's nice to be able to deploy code and configuration changes through version control. On the other hand, exportables (e.g., Views and Contexts) are nice ways of moving sometimes extensive configuration work from one machine to another.</p> <h3>Sales pipeline</h3> <p>Here I'm afraid we're amateurs. We have our inquiry form. We have phones. We have email. We do things the old fashioned way. That means that, no doubt, our sales process is probably woefully inefficient at times. We're not huge, not even big enough to have a dedicated sales person, so a robust CRM really does not seem to make sense — in fact, it would probably just make everything harder to manage, spending all our time trying to get the CRM to record things in ways that are findable. If you fill out our inquiry form, or call us, or email us, it's we at the other end who are fielding your inquiry, no salespeople or account managers. Consider it the personal touch.</p> <h3>Drupal community communications</h3> <p>Anyone in the community can tell you, the ways to communicate are: on the *.drupal.org websites, in IRC, and on the email lists.</p> <p>And at Drupal events!</p> <p class="image-teaser_full"><img src="http://pingv.com/f/imagecache/teaser_full/blogimgs/JoshuaDavisPhotography-4612980067_4a0d2ddd25_o.jpg" alt=" Blue Angels in formation" title="//www.flickr.com/photos/articnomad/4612980067/ (Creative Commons)." class="imagecache-teaser_full" /><br /> <span class="image-caption">Smooth coordination can be a challenge for any team. The Blue Angels set the standard. Photo by <a href="http://www.flickr.com/photos/articnomad/4612980067/">Joshua Davis Photography</a> (Creative Commons).</span></p> <p>The common thread through all of this is communication. It's not everything, but it's the most important thing.</p> <div class="bhbadge" id="bhbadge_Syndicated"><a href="http://www.blogher.com?from=bhsbadge" target="_blank"><img src="http://www.blogher.com/files/edbadge_syndicated.jpg" border="0" alt="Syndicated on BlogHer.com" title="Syndicated on BlogHer.com" width="120" height="100" /></a></div><div class="field field-type-nodereference field-field-related"> <div class="field-label">Related:&nbsp;</div> <div class="field-items"> <div class="field-item odd"> <a href="/blog/open-atrium-and-iterations">Open Atrium and Iterations</a> </div> <div class="field-item even"> <a href="/blog/a-roadmap-for-success-the-design-brief">A Roadmap for Success: The Design Brief </a> </div> </div> </div> http://pingv.com/blog/our-virtual-team-toolbox#comments Amazon Web Services Drupal Git Linode Liquid Planner Open Atrium project management version control Mon, 11 Jul 2011 17:40:42 +0000 Laura Scott 134 at http://pingv.com Open Atrium and Iterations http://pingv.com/blog/open-atrium-and-iterations <h3>Too busy <em>doing</em> the doing to talk about the doing?</h3> <p>As a strategy and design studio, we're all over communications. It's an uninterrupted conversation with our clients, hashing out ideas, working iterations of goals definition, research, wireframes, designs. But when it comes to development, when we put our heads down and get to work, it's all too easy for us in our focused implementation state to just do it and not communicate enough about what we're doing. Of course, this can be disconcerting to the client who has no idea how things are going. And that's a ripe situation for fear, uncertainty and doubt to creep into the relationship, and suddenly a successful project-in-progress can <em>feel</em> troubled, even if it's not.</p> <p>The simple solution is to give regular status updates, which is something we've always done. Even just saying, "Things are going well" can help. But on long projects, or even in 3-week iterations, repeating that same message ends up being not that helpful. Better to share what you're thinking with regards to planning and project management, and provide updates on development of the various features/backlog items worked out in the strategy and design phases. This transparency in the project management process is even better when updates are more specific.</p> <p>We have been using <a href="http://openatrium.com">Open Atrium</a>, the powerful intranet CMS built in <a href="http://drupal.org">Drupal</a>, developed initially by our friends at <a href="http://developmentseed.org">Development Seed</a>, now maintained by <a href="http://www.phase2technology.com/">Phase2 Technology</a>, for our intranet to handle all client-facing communications, documentation, file sharing and issue tracking. It's been a great tool for this. No missed emails lost in the spam filter. No critical documentation lost on someone's hard drive. No mega-emails containing two dozen specific items. (Well, those still happen on occasion, but we now can push those into the intranet to continue discussion.) We love it. </p> <p>And now we love it even more.</p> <h3>Rethinking Open Atrium</h3> <p>We had been using almost all of Open Atrium's various features: messages, uploads, case tracker, books for documentation, and of course the groups functionality. Almost all of the features. The part that didn't really fit in with our communications strategy was the OA notion of "Projects". Until now.</p> <p>You see, in Open Atrium, the basic architecture is thus: You have Clients, which are defined by groups, and you have Projects, which are ways of grouping tickets within the group by project. It can make sense for a large organization using OA for internal communications to manage several projects. But for a professional services firm like a strategy and design company, or a software company, or any other kind of company that defines work by time-boxed iterations or sprints, breaking up stuff by "project" may not be that useful. <em>Projects projects projects blah!</em> At <a href="http://pingv.com">PINGV</a>, we rarely have a series of small projects with a client where it would make sense keeping them all together in one group; we tend to do bigger projects, projects that have phases of strategy, design and planning, and iterations of development. And when we have a new large-ish project with an existing client, we just spin up a new Atrium group. Project was that <a href="http://memory-alpha.org/wiki/Dunsel">dunsel</a> feature — the thing that for us had no real use. But—</p> <p><em>What if we use "Project" nodes to define phases and iterations?</em> </p> <h3>Wash that nomenclature right out of OA</h3> <p>Ignoring nomenclature, and just looking at what "Project" as a functionality in Open Atrium does for us, it provides a way to group tickets into clumps that you can define by anything. If we define those clumps as iterations, perhaps, or phases, we can organize and parse through backlog items, features, questions and other tickets by iteration, while providing some ready clarity as to how and when these items will be taken on. <em>(NB: It's an approach that works only with Tickets, not other node types, but in our mind that's a minor limitation.)</em></p> <p>What's really convenient is that Open Atrium provides via UI the means to rename "Project" to whatever you prefer to call it (e.g., "Iteration"). These string replacements, configured in the group feature settings available to site administrators from within each group's space, work almost everywhere in OA. (The "Add Project" button seems to be unaffected even by string replacements defined in settings.php. Something to investigate later.)</p> <p>Once we saw this potential for grouping issues into iterations, we ran with it.</p> <h3>Defining iterations in Open Atrium</h3> <p class="image-teaser_full"><img src="http://pingv.com/f/imagecache/teaser_full/blogimgs/OAiterations-3.png" alt="Open Atrium screenshot" class="imagecache-teaser_full" /><span class="image-caption">Using "projects" in Atrium, we can define iterations by close date, and assign tickets to iterations.</span></p> <p>As you can see, the Iteration title is compressed down to an abbreviation or acronym in the icon in the tickets display. "Iteration 1" becomes "I1", "General" becomes "GENERA", and so on. After briefly considering using iteration numbers, which we rejected as too arbitrary, we opted to name iterations by the Iteration release date, or end date (<em>e.g.</em>, 08/17 or even 11/10/23), which can be abbreviated in a meaningful way in the Tickets views. This gives our clients added insight into our timetable planning at a glance.</p> <p>Adding a sortable Iteration column to the tickets view involves a simple override to the default ticket View. (If ever we need to revert that Feature during a site update, these changes are easily re-implemented in a few minutes. No actual data is affected.)</p> <p class="image-teaser_full"><img src="http://pingv.com/f/imagecache/teaser_full/blogimgs/OAiterations-1.png" alt="Open Atrium screenshot" title="You can view all of the iterations planned, and see their descriptions. Each iteration is clickable for detailed viewing." class="imagecache-teaser_full" /><span class="image-caption">You can view all of the iterations planned, and see their descriptions. Each iteration is clickable for detailed viewing.</span></p> <p>This approach allows us also to focus just on the tickets that are relevant now, without having to sort through all the other tickets that are further down in the timetable, and without having to mark dozens (hundreds?) of individual tickets as "deferred" and then change those as they come available.</p> <p class="image-teaser_full"><img src="http://pingv.com/f/imagecache/teaser_full/blogimgs/OAiterations-2.png" alt="Open Atrium screenshot" title="Single iterations of backlog items can be viewed as well, and this is stock functionality for Open Atrium." class="imagecache-teaser_full" /><span class="image-caption">Single iterations of backlog items can be viewed as well, and this is stock functionality for Open Atrium.</span></p> <p>The bulk of communications still happens in the individual tickets. Questions, information, updates, concerns, notes can be tied to the ticket itself. New questions and bug reports can also be slotted for attention in a scheduled Iteration. So even though we're grouping our backlog items together, we still avoid the one-ticket-for-8-issues kind of communications that can lead to confusion, frustration and missed messages.</p> <p class="image-teaser_full"><img src="http://pingv.com/f/imagecache/teaser_full/blogimgs/OAiterationsX-3.png" alt="Open Atrium screenot" title="On any comment update, you can change the iteration assignment of a ticket" class="imagecache-teaser_full" /><br /> <span class="image-caption">On any comment update, you can change the iteration assignment of a ticket.</span></p> <p class="image-teaser_full"><img src="http://pingv.com/f/imagecache/teaser_full/blogimgs/OAiterationsX-1.png" alt="comment status change" title="And all changes are tracked in the comment metadata displayed right there in the thread." class="imagecache-teaser_full" /><br /> <span class="image-caption">All changes are tracked in the comment metadata displayed right there in the thread.</span></p> <p>We like this system so far because of this fact that all changes are tracked and visible in each ticket's thread. If we move up a backlog item to a higher priority, we simply do it with a comment and change in iteration designation. This flexibility with traceability provides a nice balance for communicating our planning.</p> <p><em>And it's all using stock Open Atrium!</em></p> <h3>Plan before communicating, and vice versa</h3> <p>I should add that this is not how we do our actual project management. Open Atrium is a great tool for project-related communications. We currently use <a href="http://pingv.com/staff/brian-vuyk">Brian</a>'s recommendation, we tried <a href="https://app.liquidplanner.com/signup_a/197/8b0f76e9013600f64f3ac66f188e99525b7945c6">Liquid Planner</a> (disclosure: affiliate link; go to liquid planner dot com to skip it if you like) for our internal planning. Liquid Planner has an API, and we're considering developing an integration with Open Atrium to allow us to push and pull info between the two. Might be a nice convenience. We do the translation manually now, and while it can take up time on occasion, it also provides an occasion to rethink and re-evaluate, so the manual process does have value.</p> <h3>Feature think, Feature do</h3> <p>Now for the road <em>not</em> taken:</p> <p>When first considering the challenge of better communicating our iterations plans, I imagined up a very simple Features-based solution using nodes and node reference, which resulted in <a href="http://drupal.org/project/oa_iterations">Open Atrium Iterations</a>. This module works as a drop-in extension to Open Atrium. Not touching any existing Atrium Features, OA Iterations defines a new content type with reference fields to call up tickets (cases), messages (blog posts) and documentation (books) that collectively define and describe an iteration of work. A dedicated view restricts the available referenced nodes to the current group's content.</p> <p>On Friday afternoon, this seemed like a fine way to communicate our iteration planning. Tickets, as well as blog posts and book nodes, could live on their own, with their own revisions and threads, while the Iteration node would group them into an iteration. Done. Time to relax and prepare for a weekend cleaning the garage.</p> <p>On Monday morning, however, when I sat down to start defining the iterations for one of our projects, I immediately questioned my own game plan. Open Atrium Iterations was an easy way to define iterations, but making changes would be difficult. What if I wanted to move a ticket from one iteration to another? Yes, this project was never intended for iteration <em>planning</em>, just iteration <em>communication</em>, but even just for communications this approach would mean editing at least two Iteration nodes just to "move" one backlog item. What's more, without implementing Reverse Node Reference and adding that block to one or more Contexts (and thus overriding stock Open Atrium Features), there was no way to look at a backlog item and see what iteration it's slotted for. The simple solution was not turning out to be so simple after all.</p> <p>And that's when the flicker of the idea described above came to mind. In hindsight, I can smack myself for not thinking of this before. I've been working with Atrium for two years. But I think I got stuck on nomenclature.</p> <h3>Contrib status</h3> <p>Meanwhile, despite our not using it as originally planned, <a href="http://drupal.org/project/oa_iterations">Open Atrium Iterations</a> will remain live on Drupal.org to see if it proves helpful to others. If the Feature can be improved upon to make it more broadly useful to serve more use cases, I look forward to suggestions in the issue queue.</p><div class="field field-type-nodereference field-field-related"> <div class="field-label">Related:&nbsp;</div> <div class="field-items"> <div class="field-item odd"> <a href="/blog/kit-best-practices-for-making-drupal-features">KIT: Best Practices for Making Drupal Features</a> </div> </div> </div> http://pingv.com/blog/open-atrium-and-iterations#comments Drupal development Drupal distributions Features Open Atrium Open Atrium Iterations project management Thu, 30 Jun 2011 17:19:56 +0000 Laura Scott 140 at http://pingv.com The best user interface is the one you don't notice http://pingv.com/blog/the-best-user-interface-is-the-one-you-dont-notice <p>We all want beautiful things. A beautiful graphic user interface is no exception. But how do you define beauty? Pretty colors? Balanced composition? Elegant typography? Appealing trimmings? Grid fidelity?</p> <p>Without diminishing those things, my feeling is that, when it comes to GUIs, the most beautiful are the ones you don't notice. The beautiful GUI is so useful, so understandable, so usable that you don't even think about the inteface — you're totally absorbed in <em>what you're doing via the interface</em>. This is true for simple devices as well as for complex expert apps where, once you get familiar with the tools, you just use them without thinking.</p> <h3>Expert interfaces are for experts</h3> <p>The thing about expert interfaces is that, while they are complex, they are optimized so that a well-trained user can use them efficiently. For example, non-linear video editing systems like Avid Media Composer are rather complex. They have lots of tools that bring great power to the editor. They also have keyboard shortcuts for nearly every function, and ready buttons for commonly needed items. Once the user is practiced on the system, the expert interface becomes much easier to use than the simple interface. For example, a professional video editor would go nuts trying to work in iMovie — it's just <em>too simple!</em></p> <p>And yet for the casual user, iMovie is much more useful, much more usable, much more transparent. In other words, the complexity of the interface depends upon the knowledge, experience and needs of the user.</p> <p class="image-teaser_full"><img src="http://pingv.com/f/imagecache/teaser_full/blogimgs/french-horn.jpg" alt="french horn" title="The expert interface requires many many hours of practice. Do you want your website to be as difficult as playing French horn?" class="imagecache-teaser_full" /><span class="image-caption">The expert interface requires many many hours of practice. Do you want your website to be as difficult as playing French horn?</span></p> <p class="image-teaser_full"><img src="http://pingv.com/f/imagecache/teaser_full/blogimgs/spacewalk.jpg" alt="astronaut spacewalking" title="Astronauts train every day so that they focus not on their gear but on what they need to do." class="imagecache-teaser_full" /><span class="image-caption">Astronauts train every day so that they focus not on their gear but on what they need to do.</span></p> <p>This is perhaps one reason why <a href="http://rarepattern.com/nodes/2011/video-professionals-just-get-new-life-already-apple-isnt-looking-you">Apple has gotten so much flack for reinventing the UI, among other things, of FInal Cut Pro</a>. Expert interfaces require hours of training and practice. Apple has ripped many tools out, changed much of the rest, and added yet new things. For the casual video editor, Final Cut Pro X may be like manna from heaven, but for video editing professionals it requires retraining, and the missing features may render such training not worth the investment. Meanwhile, if you have to <em>think</em> about <em>how</em> you're doing instead of <em>what</em> you're doing, you're simply not as productive.</p> <p>The same would be true for a feature-rich community site. Change how everything works and you'll have a riot from the community members. The features don't belong to the website, they belong to the users. "What happened to <em>my</em> sort button?" Suddenly they have to focus on the interface, not on what they are doing with it. </p> <h3>The unnoticed interface</h3> <p class="image-teaser_full"><img src="http://pingv.com/f/imagecache/teaser_full/blogimgs/iStock_000012959689XLarge-cropped.jpg" alt="woman with eyeglasses" title="If you&#039;re focusing on your glasses, not the subject through the camera, your glasses are dirty." class="imagecache-teaser_full" /><br /> <span class="image-caption">If you can't get a camera to do what you want, your camera's user interface is getting in the way of what you're doing. If you're focusing on your glasses, not the camera settings and the subject through the camera, your glasses are dirty or they are the wrong prescription.</span></p> <p>What is the best user interface? I would argue that one example is a very low-tech object: eyeglasses. They are devices that are a means to an end — seeing. If they are dirty — that is, if you notice them — then they suck. All of us who wear glasses probably share the experience at one time or another of searching for the glasses that we were wearing at the time. (One time recently I was tearing the house apart. My glasses are for nearsightedness mostly; I can't see up close with them on. When I went to the couch to see if they got tucked into the cushions, I took off my glasses to see better— *facepalm*.)</p> <p class="image-teaser_full"><img src="http://pingv.com/f/imagecache/teaser_full/old-woman-headphones-smile.jpg" alt="" title="The best design is the one you don&#039;t notice, you just use." class="imagecache-teaser_full" /><span class="image-caption">The best design is the one you don't notice, you just use.</span></p> <p>Other user interfaces we don't notice: doorknobs, the driving controls on our cars, water faucets, dresser drawers. All of these, except for the automobile controls, are simple, and the automobile controls are dependent upon some standardization and all of us sharing some basic training on their use. If a manufacturer came out with a new car that put steering in the pedals and throttle on a lever, never mind what governments would do, the buyers would stay away — their driving training would be of little use.</p> <p>On websites, most of which cater by necessity to the casual user — even regular visitors don't want to invest hours of training just to be able to post a comment — we're seeing much standardization in functionality, layout, even icons usage. Is this bad? Is this boring? Is this bad design? Or is it making these sites more usable, more transparent so users can focus on what they're doing, be it reading, posting, linking, uploading, liking, tweeting...? And isn't that what we want? Sites that make it easy for users to do the things they (and we) want them to do?</p> <p>What is a website but a means to an end? If the user is noticing the website, instead of doing what she needs to do, then it's quite possible that the website is non-optimal. Its UI lens is dirty.</p><div class="field field-type-nodereference field-field-related"> <div class="field-label">Related:&nbsp;</div> <div class="field-items"> <div class="field-item odd"> <a href="/blog/did-your-website-end-up-doing-the-wrong-job">Did your website end up doing the wrong job?</a> </div> </div> </div> http://pingv.com/blog/the-best-user-interface-is-the-one-you-dont-notice#comments design interaction design user experience Wed, 29 Jun 2011 16:46:13 +0000 Laura Scott 31 at http://pingv.com Announcing Apache Solr Pages http://pingv.com/blog/announcing-apache-solr-pages <p>Ever needed to produce functionality in Drupal that multiple modules came really close to providing — but none of them seemed to get it quite right? We recently experienced this issue when needing to create an advanced search page in Drupal 7 for a client. We needed the ability to create pre-filtered result pages from essentially an empty query, displaying everything in a default result that the user could then continue to filter or search within, as needed. This was a strict UI requirement we faced, so we had to rule out what otherwise might have been reasonable alternatives, such as using normal <a href="http://drupal.org/project/views">Views</a> with exposed filters. That Solr-like experience was essential.</p> <p>We knew we needed facets, and we knew that <a href="http://drupal.org/project/apachesolr">Apache Solr</a> would fit that bill nicely. But we also needed a way to make our own pre-filtered pages as a starting point. <a href="http://drupal.org/project/search_api">Search API</a> would fulfill that need, but to use Search API would require working with entities for the results — and Search API is also facing some refactoring that we wanted to avoid having to compensate greatly for.</p> <p>Well, if Views alone wouldn't match the interface requirements, what about Views in Apache Solr? Sadly, Views support isn’t in Apache Solr for Drupal 7 yet. So we had to go back to the drawing board and, keeping simplicity in mind, find a way to solve our client's basic requirements. </p> <p>After having the opportunity to meet with <a href="http://drupal.org/user/49851">Peter Wolanin</a>, one of the co-maintainers of Apache Solr, it became apparent that we may not even need to port, or integrate into the main Apache Solr project, Apache Solr Views to solve our issue.</p> <p class="image-teaser_full"><img src="http://pingv.com/f/imagecache/teaser_full/blogimgs/drupal-7-apachesolr-pages-banner.jpg" alt="Apache Solr Pages" title="Apache Solr Pages extends Apache Solr pre-filtered result pages, displaying everything in a default result, with exposed facets." class="imagecache-teaser_full" /><span class="image-caption">Apache Solr Pages extends Apache Solr pre-filtered result pages, displaying everything in a default result, with exposed facets.</span></p> <p>Applying the logic of creating the simplest solution to fulfill our needs in several hours of late-night development I was able to repurpose another Search API feature, the searchapi_page module, and use it in the context of Apache Solr. This gains us a few distinct advantages:</p> <ul> <li>We are able to create the multiple pre-filtered pages we need for our use case.</li> <li>We don’t have to rely on the overhead and complexity of using views to build our Solr query.</li> <li>We’re indirectly able to provide an extension use case in Drupal 7 for Apache Solr module.</li> </ul> <p>The <a href="http://drupal.org/project/apachesolr_page">Apache Solr Pages module</a> [corrected URL] is still in need of additional work and a lot of cleanup to remove all of the legacy bits that were carried over from Search API; however, it is presently working for our basic use case. The following features actively need additional help to bring the module to a product-ready release:</p> <ul> <li>Apache Solr’s “Current Search” block needs to receive proper integration, with the pre-defined filters being hidden or locked in with disabled fields per the administrator’s choice.</li> <li>This also provides a chance to look into ways to better allow the Current Search block to be extensible by other modules upstream in Apache Solr.</li> <li>View modes that were in Search API’s rendition of pages aren’t supported here; Search API code that allowed this is still in the module but needs refactoring to work.</li> <li>Paging is currently broken due to the difference in how Search API and Solr return results.</li> <li>Need to apply Apache Solr’s “on empty” effect, or allow it to be overridden on a page-by-page basis.</li> </ul> <p>The <a href="http://drupal.org/project/apachesolr_page">Drupal 7 branch of Apache Solr Pages is available for download today</a>, and I look forward to seeing more input from the community not just around this module, but around search in the future of Drupal in general.</p> http://pingv.com/blog/announcing-apache-solr-pages#comments Apache Solr pages Drupal Drupal 7 Drupal modules Solr search Tue, 05 Apr 2011 12:47:06 +0000 Robin Monks 139 at http://pingv.com Lucidly Drupal: Setting up Ubuntu 10.4 Lucid LAMP stack for your Drupal site http://pingv.com/blog/lucidly-drupal-setting-up-ubuntu-10-4-lucid-lamp-stack-for-your-drupal-site <p>We're frequently setting up servers for development, for staging, for production. I've lately preferred the Debian flavor of Linux, but up until now that had been something of a problem because Debian and Ubuntu did not include the higher-quality php5-gd library, which meant that you either had to compile your own PHP, pull from an alternative source host, or cope with substandard image resizing with limited processing features.</p> <p>But now we have <a href="https://help.ubuntu.com/community/Server/TechSpecs/1004LTS">Ubuntu 10.4 LTS "Lucid"</a> and life is good. Lucid comes with PHP 5.3.x and the proper GD2 library! (Cheers. Applause.)</p> <p>Still, there's a lot of little steps to set up to get your server (or virtual private server) up and running and ready for Drupal. It's not hard, just detail-oriented work you don't want to do when you're bleary-eyed at the end of the day. In my repetitions of doing this over and over, I've collected some notes, and I thought I'd post them here for my own reference, and perhaps your reference as well. My thanks to our own Brian Vuyk for guidance on the APC installation.</p> <p><em>[Edit: Brian also pointed me to Taskel as another way to go. I've not tried it that way yet, so this post doggedly sticks to the step-by-step for now.]</em></p> <p class="image-teaser_full"><img src="http://pingv.com/f/imagecache/teaser_full/blogimgs/drupal-linux.jpg" alt="Ubuntu Linux + Drupal" title="" class="imagecache-teaser_full" /><span class="image-caption">Drupal requires some things, and likes some other things a lot. Here's how to configure the latest Ubuntu Linux to make Drupal happy.</span></p> <h3>Assumptions</h3> <ul> <li>You already have Ubuntu 10.4 installed on your server.</li> <li>You know your server's IP address.</li> <li>You already have root or sudo access.</li> <li>You want to set up for Drupal. (Of course, many CMSs and blog platforms will have similar requirements, and this post may have some appeal and relevance to people using those tools. But in this post I'm aiming at the particulars for Drupal.)</li> <li>You have a computer with shell access to your server, or a properly configured *AMP setup on your computer. (This post does not cover MAMP, WAMP, DAMP or commandline bootcamp.)</li> </ul> <h3>Step by Step</h3> <ol> <li> <h4>Initial Preparation</h4> <ol> <li> <h5>Create a public key.</h5> <p>If you do this, you can connect to your server without having to log in. It's also necessary if you want to deploy from a provisioning system or repository like GitHub.</p> <pre> ssh-keygen -t rsa -C "yourname@example.com" </pre><p> <em>Note: For deployment purposes, you need to generate the key as the user who will be executing the checkouts. For example, if you checkout as root, you will need to be logged in as root when generating the key.</em></p> <p>To print out the key (to copy and paste into GitHub, for example):</p> <pre>cat ~/.ssh/id_rsa.pub</pre></li> <li> <h5>Install security updates.</h5> <p> FIrst things first.</p> <pre> apt-get update apt-get upgrade --show-upgraded </pre><p> Note that if you are using a regular shell user account with sudo, you will want to prepend pretty much all commands in this guide with "sudo". For example: <code>sudo apt-get update</code> would be the first command above. </p></li> <li> <h5>Set your hostname</h5> <p>You should give your machine a name. This is a machine name for your server. It does mean anything about your domain or what URL you want to use for your site. For this example, we'll use the name "athena":</p> <pre> echo "athena" &gt; /etc/hostname hostname -F /etc/hostname </pre><p> Next, edit the file "<code>/etc/hosts</code>". There are a few options for text editor within Linux. I find <strong>nano</strong> to be easy to use.</p> <pre> nano /etc/hosts </pre><p> <em><strong>[NB: In these instructions, your server's IP address is represented by "12.34.56.78". Every time you see that sequence in the examples here, you should replace them with your server's IP address. Also replace "athena" everywhere it appears with your server's name, and "example.com" with your actual domain.]</strong></em></p> <p><div class="codeblock"><code>127.0.0.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; localhost.localdomain&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; localhost<br />12.34.56.78&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; athena.example.com&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; athena</code></div></p> <p><em>athena.example.com</em> is your "fully qualified domain name" or FQDN. (You will come across this from time to time.) </p></li> <li> <h5>Set your server's base timezone</h5> <p>This part is easy:</p> <pre>dpkg-reconfigure tzdata</pre><p> You will get pop-up prompts for country, etc. and that's done! </p></li> </ol> </li> <li> <h4>Set up VirtualHost stuff</h4> <ol> <li> <h5>Install Apache</h5> <p>First things first.</p> <pre>apt-get install apache2</pre></li> <li> <h5>Edit <code>/etc/apache2/ports.conf</code></h5> <pre> nano /etc/apache2/ports.conf </pre><p> Replace *:80 with your IP address, so it looks like this:</p> <p><div class="codeblock"><code>NameVirtualHost 12.34.56.78:80</code></div> </p></li> <li> <h5>Edit <code>/etc/apache2/sites-available/default</code></h5> <pre> nano /etc/apache2/sites-available/default </pre><p> Edit as such:</p> <p><div class="codeblock"><code>&lt;VirtualHost 12.34.56.78:80&gt;</code></div></p> <p>You will also want to update the DocumentRoot value to where you intend to install your Drupal root.</p> <p><div class="codeblock"><code>DocumentRoot /var/www/example.com/html</code></div> </p></li> <li> <h5>Configure name-based virtual hosts</h5> <p>Create a file in </p> <pre>/etc/apache2/sites-available/</pre><p> for each of your sites on the server.</p> <pre> nano /etc/apache2/sites-available/example1.com </pre><p> <div class="codeblock"><code>&lt;VirtualHost 12.34.56.78:80&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp; ServerAdmin <a href="mailto:admin@example1.com">admin@example1.com</a><br />&nbsp;&nbsp;&nbsp;&nbsp; ServerName example1.com<br />&nbsp;&nbsp;&nbsp;&nbsp; ServerAlias <a href="http://www.example1.com" title="www.example1.com">www.example1.com</a><br />&nbsp;&nbsp;&nbsp;&nbsp; DocumentRoot /var/www/example1.com/html/<br />&nbsp;&nbsp;&nbsp;&nbsp; ErrorLog /var/www/example1.com/logs/error.log <br />&nbsp;&nbsp;&nbsp;&nbsp; CustomLog /var/www/example1.com/logs/access.log combined<br />&lt;/VirtualHost&gt;</code></div></p> <p>Repeat this process for each site you are setting up. <em>Note that separate sites will have different DocumentRoot values, while a multisite setup will share the same DocumentRoot value.</em></p> <p><strong>Git note:</strong> If you are going to deploy using Git (covered in the next step below), you want to define your DocumentRoot to include your Git repository name and any internal paths to your Drupal document root. <em>For example</em>, if you are installing from a GitHub project titled "foobar" and inside of it you have a folder "html" that contains your Drupal installation, your DocumentRoot value would be /var/www/example.com/foobar/html/. </p></li> <li> <h5>Create your website folders</h5> <ul> <li> <h6>First, create the folder for your logs.</h6> <pre> mkdir -p /var/www/example.com/logs </pre><p> This command will create your logs folder, and the domain folder containing it. </p></li> <li> <h6>Now create your website html folder(s).</h6> <p>How you do this depends upon how you're going to install your site on the server.</p> <p><strong>If you are using <strong>scp</strong> or sftp or otherwise copying your Drupal code files onto the server</strong>, you will want to create the folder to hold them. Remember that your DocumentRoot value you entered above must match where your actual document root ends up being on the server.</p> <p><strong>If you are going to be deploying via Git</strong>, you don't need to do that: Git will create it when you <strong>git clone</strong> the repository onto the server into /var/www/example.com/.</p> </li> </ul> </li> <li> <h5>Enable the virtual domain</h5> <pre> a2ensite example.com </pre><p> Do this command for each domain or subdomain you're configuring here. </p></li> <li> <h5>Reload Apache</h5> <pre> /etc/init.d/apache2 reload </pre></li> </ol> <p>Assuming that you have configured the DNS for your domain to point to your server's IP address, virtual hosting for your domain should now work.</p> <p>Of course, there's still more server prep to do so you can run Drupal.... </p></li> <li> <h4>Build PHP, MySQL and the goodness Drupal loves</h4> <ol> <li> <h5>MySQL Installation</h5> <p>First install the thing.</p> <pre> apt-get install mysql-server </pre><p> You will be prompted to create the MySQL root password, and re-enter it.</p> <p>Now we secure the installation.</p> <pre> mysql_secure_installation </pre><p> You will be prompted to set/change the MySQL root password and other things. You won't need to change the MySQL root password, but you probably want to answer "Y" yes to the other questions. </p></li> <li> <h5>Create your database</h5> <p>Log into MySQL.</p> <pre> mysql -u root -p </pre><p> The -u defines the mysql user, which in this case is mysql root user, 'root'. You will be prompted for the MySQL root password. When you get a prompt like this:</p> <pre> mysql&gt; </pre><p> …you're in!</p> <p>Now create your database. [In this example, the database name is 'foobar', the database user is 'rumpole', and the user password is 'p4ssw0rd'. Change these to the actual database name, database user and passwords you want for your database. <em>Be sure to note these down, because you'll need this info when you set up your Drupal site.</em>]</p> <pre> create database foobar CHARACTER SET utf8 COLLATE utf8_general_ci; </pre><p> <em>[<strong>Update</strong>: You need to set the CHARACTER SET and COLLATE values, as shown above, or MySQL will default to non-recommended latin1 / latin_swedish_ci.] </em></p> <p>Note the ';' at the end of the line. That is required for MySQL to execute the command.</p> <p>Define the user and permissions for the database. I'll keep it easy here:</p> <pre> grant all on foobar.* to 'rumpole' identified by 'p4ssw0rd'; </pre><p> Now wrap this up and quit MySQL:</p> <pre> flush privileges; quit </pre></li> <li> <h5>Install PHP</h5> <p>Use apt-get to pull down the packages.</p> <pre> apt-get install php5 php5-dev php-pear php5-gd </pre><p> Note that php5-dev is not necessarily required, except you will need it later for the PECL installation of UploadProgress (which is very nice to have for the Drupal user interface). php5-gd is to enable nice image handling.</p> </li> <li> <h5>Configure the <code>php.ini</code> settings.</h5> <p>Edit the appropriate php.ini file:</p> <pre> nano /etc/php5/apache2/php.ini </pre><p> This is a big file. You will need to search through the file to find these value configurations.</p> <p>You will want to boost the default memory limit value.</p> <p><div class="codeblock"><code>memory_limit: 128M</code></div></p> <p>(128MB is the default for Lucid. If you're running a lot of modules, or some heavy processes, you may need to increase this memory_limit value even higher.)</p> <p>Now, while you in php.ini, make sure that the following lines are uncommented and have proper values established.</p> <p><div class="codeblock"><code>max_execution_time = 30<br />error_reporting = E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR<br />display_errors = Off<br />log_errors = On<br />error_log = /var/log/php.log<br />register_globals = Off<br />safe_mode = Off<br />session.cache_limiter: nocache</code></div></p> <p><s>You will also need to add lines for PDO support. Find the Dynamic Extensions area in the file, and add these lines:</s></p> <p><s>extension=php_pdo.dll</s><br /> <s>extension=php_pdo_mysql.dll</s></p> <p><em>[<strong>Edit:</strong> You don't need to add these in Ubuntu 10.04. As it happens, Lucid comes with PDO extensions already enabled. Thanks to Peter Wolanin for pointing out in comments below what should have been obvious about .dll extensions in Linux. #facepalm]</em></p> <p>Refer to <a href="http://drupal.org/requirements" title="http://drupal.org/requirements">http://drupal.org/requirements</a> for details and nuances on php settings.</p> <p>To have these take effect, restart apache.</p> <pre> /etc/init.d/apache2 restart </pre></li> <li> <h5>Install PHP MySQL and Security Packages</h5> <ol> <li> <h6>Let's start with MySQL.</h6> <pre> apt-get install php5-mysql </pre></li> <li> <h6>Update your sources.</h6> <p>Now be sure the following lines in <code>/etc/apt/sources.list</code> are uncommented:</p> <pre> nano /etc/apt/sources.list </pre><p> <div class="codeblock"><code>deb <a href="http://us.archive.ubuntu.com/ubuntu/" title="http://us.archive.ubuntu.com/ubuntu/">http://us.archive.ubuntu.com/ubuntu/</a> lucid universe<br />deb-src <a href="http://us.archive.ubuntu.com/ubuntu/" title="http://us.archive.ubuntu.com/ubuntu/">http://us.archive.ubuntu.com/ubuntu/</a> lucid universe<br />deb <a href="http://us.archive.ubuntu.com/ubuntu/" title="http://us.archive.ubuntu.com/ubuntu/">http://us.archive.ubuntu.com/ubuntu/</a> lucid-updates universe<br />deb-src <a href="http://us.archive.ubuntu.com/ubuntu/" title="http://us.archive.ubuntu.com/ubuntu/">http://us.archive.ubuntu.com/ubuntu/</a> lucid-updates universe<br /><br />deb <a href="http://security.ubuntu.com/ubuntu" title="http://security.ubuntu.com/ubuntu">http://security.ubuntu.com/ubuntu</a> lucid-security universe<br />deb-src <a href="http://security.ubuntu.com/ubuntu" title="http://security.ubuntu.com/ubuntu">http://security.ubuntu.com/ubuntu</a> lucid-security universe</code></div></p> </li> <li> <h6>Update what you have so far.</h6> <pre> apt-get update </pre></li> <li> <h6>Boost security a bit.</h6> <p> Now install the php5-suhosin package to provide additional security.</p> <pre> apt-get install php5-suhosin </pre></li> <li> <h6>Restart apache.</h6> <p>To have these take effect, restart apache.</p> <pre> /etc/init.d/apache2 restart </pre></li> </ol> </li> <li> <h5>Enable mod_rewrite</h5> <p>This is easy peasy in Ubuntu because the PHP module is already installed; you just need to enable it:</p> <pre> a2enmod rewrite </pre><p> And restart apache again:</p> <pre> /etc/init.d/apache2 restart </pre></li> <li> <h5>Install PECL UploadProgress.</h5> <p>This allows you to have that nifty upload progress display when uploading files. It's not required, but is useful user feedback, which I recommend highly.</p> <ol> <li> <h6>First, update.</h6> <pre> apt-get update </pre></li> <li> <h6>Run the PECL installation of UploadProgress.</h6> <pre> pecl install uploadprogress </pre></li> <li> <h6>Now save the setting.</h6> <p><em>Note: This is all one line!</em></p> <pre> echo "extension = uploadprogress.so" &gt; /etc/php5/apache2/conf.d/uploadprogress.ini </pre></li> <li> <h6>Reload Apache to have it take effect.</h6> <pre> /etc/init.d/apache2 reload </pre></li> </ol> <p><strong>Done!</strong></p> </li> </ol> </li><li> <h4>Optional</h4> <ol> <li> <h5>Install Git</h5> <p>If you want to use Git to deploy your site code, you will need to install Git itself.</p> <pre> apt-get install git-core </pre></li> <li> <h5>Install Drush and Drush Make</h5> <p>Drush installation instructions are in the <a href="http://drupalcode.org/project/drush.git/blob_plain/HEAD:/README.txt">Drush readme.txt file</a>.</p> </li> <li> <h5>Install APC</h5> <pre> apt-get install libpcre3-dev pecl install apc </pre><p> Then edit your php.ini file to add to the extensions area:</p> <p><div class="codeblock"><code>; APC<br />extension=apc.so;<br />apc.shm_size=64M;</code></div></p> <p>Then you can copy over a php file that offers some nice stats:</p> <pre> cp /usr/share/php/apc.php /var/www/example.com/html/apc.php </pre><p> Note that the path of the destination is your webroot.</p> <p>Then restart apache.</p> <pre> /etc/init.d/apache2 restart </pre><p> And you're done. You will be able to get some nice APC stats at <a href="http://example.com/apc.php" title="http://example.com/apc.php">http://example.com/apc.php</a>. (You can always protect that file via .htaccess to put an authentication password on it if you like.) </p></li> <li> <h5>Install fail2ban</h5> <p><a href="http://www.fail2ban.org/wiki/index.php/Main_Page">Fail2ban</a> is a nice little security addition.</p> <pre> apt-get install fail2ban </pre><p> That's all on that.</p> </li> <li> <h5>Install bash-completion</h5> <p><a href="http://linuxhelp.blogspot.com/2005/09/bash-completion-makes-life-easier-for.html">Bash-completion</a> is a new one for me, and is turning out to be very handy. How did I go so long in the dark?</p> <pre> apt-get install bash-completion </pre></li> </ol> </li> </ol> <p>And that's it. Now your system is ready for site deployment to the folder you defined. Note that after you've deployed your site you will also want to <a href="http://drupal.org/cron">set up a cron job</a>. </p> <h3>IANASA</h3> <p>I am not a sysadmin by profession. This is just documentation of what I do for my own projects, or when tossing up a staging server for one of our in-house or client projects. Any tips for improvement, corrections, etc. are <em>most welcome.</em></p> <h3>Update: Clean URLs problem?</h3> <p>Recently I've run into an added complication with setting up Lucid: clean urls were not working. rewrite_module was enabled, .htaccess was there, but no go. As it turns out, .htaccess was not being read by default. If this happens to you, here's a fix:</p> <p>Edit the default site configuration in sites-available:</p> <pre> nano /etc/apache2/sites-enabled# 000-default </pre><p> A few lines down, under the directory pointing to you docroot, you need to change "AllowOverride None" to "AllowOverride all".</p> <p><div class="codeblock"><code>&lt;Directory /var/www/[pathtoyourwebroot]&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Options Indexes FollowSymLinks MultiViews<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AllowOverride all<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Order allow,deny<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; allow from all<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Directory&gt;</code></div></p> <p>Now restart apache.</p> <pre> /etc/init.d/apache2 restart </pre><p> And you're done. Clean urls should work for you now.</p> <p>For more information on this, see <a href="http://drupal.org/node/945860" title="http://drupal.org/node/945860">http://drupal.org/node/945860</a>. To read about other ways to configure Apache and avoid the performance hit of using .htaccess, see <a href="http://drupal.org/node/43788" title="http://drupal.org/node/43788">http://drupal.org/node/43788</a>.</p><div class="field field-type-nodereference field-field-related"> <div class="field-label">Related:&nbsp;</div> <div class="field-items"> <div class="field-item odd"> <a href="/blog/rethinking-the-lamp-stack-disruptive-technology">Rethinking the LAMP stack — Drupal Disruptive Open Source Part 2</a> </div> </div> </div> http://pingv.com/blog/lucidly-drupal-setting-up-ubuntu-10-4-lucid-lamp-stack-for-your-drupal-site#comments Drupal Drupal 7 LAMP Ubuntu Ubuntu 10.4 Lucid Wed, 16 Mar 2011 18:59:51 +0000 Laura Scott 123 at http://pingv.com Grok Drupal 7 Theming - update http://pingv.com/blog/grok-drupal-7-theming-update <p>Earlier this month at <a href="https://2011.ddcla.org">Drupal Design Camp Los Angeles 2011</a>, I presented an update on <strong>Grok Drupal (7) Theming</strong>, which I had <a href="http://sf2010.drupal.org/conference/sessions/grok-drupal-7-theming">originally presented last year at DrupalCon San Francisco</a>.</p> <p>A <em>lot</em> has changed since March 2010.</p> <p class="image-teaser_full"><img src="http://pingv.com/f/imagecache/teaser_full/blogimgs/grok-how-to-get-started.jpg" alt="how to get started" title="A few things have changed in Drupal 7 theming since March 2010." class="imagecache-teaser_full" /><br /> <span class="image-caption">The presentation is for people who are new to Drupal theming, as well as those who want to get a better sense of what's new in Drupal 7 theming.</span></p> <p>I expanded on the previous presentation, clarified some points, and replaced a few slides with better ones.</p> <p><a href="http://ladrupal.blip.tv/file/4731722">A video of my slide presentation is available on the DDCLA Blip TV site</a>. The slides are kind of fuzzy because the recording app captured my presentation notes screen instead of my presentation screen. My sincere gratitude goes out to <a href="https://2011.ddcla.org/attendees/jromine">John Romine</a> for taking care of all the session videos, including the cropping of my session to just the relevant slides.</p> <p>The video should be legible enough, but I've also posted <a href="http://www.slideshare.net/laurascott/grok-drupal-7-theming-2011-feb-update">higher resolution slides up on Slideshare</a>.</p> <div id="__ss_6840990"> <h3><a href="http://www.slideshare.net/laurascott/grok-drupal-7-theming-2011-feb-update" title="Grok Drupal (7) Theming - 2011 Feb update">Grok Drupal (7) Theming - 2011 Feb update</a></h3> <object id="__sse6840990" width="425" height="355"><embed name="__sse6840990" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=grokdrupaltheming-2011febupdate-distilled-110207114910-phpapp02&amp;stripped_title=grok-drupal-7-theming-2011-feb-update&amp;userName=laurascott" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object></div> <p>It was great meeting various folks at Drupal Design Camp LA. Big thanks to <a href="https://2011.ddcla.org/attendees/christefano">Christefano</a> and <a href="https://2011.ddcla.org/attendees/lee">Lee Vodra</a> for their wonderful hospitality!</p><div class="field field-type-nodereference field-field-related"> <div class="field-label">Related:&nbsp;</div> <div class="field-items"> <div class="field-item odd"> <a href="/blog/a-peek-at-drupal-7-theme-system-changes">A peek at Drupal 7 theme system changes</a> </div> </div> </div> http://pingv.com/blog/grok-drupal-7-theming-update#comments design Design 4 Drupal Drupal Drupal 7 Drupal Design Camp Drupal front-end development events presentations theming Sun, 20 Feb 2011 23:53:44 +0000 Laura Scott 135 at http://pingv.com A New Year. A New Drupal. (A New Era.) http://pingv.com/blog/a-new-year-a-new-drupal-a-new-era <p><a href="http://pingv.com/about"></a>2010 was an amazing year. But 2011 has come in with such a bang, it's impossible not to look forward.</p> <h3><strong>Drupal 7 is <a href="http://drupal.org/7" title="Get started with Drupal 7!">out</a>!</strong></h3> <p class="image-teaser_full"><img src="http://pingv.com/f/imagecache/teaser_full/blogimgs/drupal-7-w-bg---offset.jpg" alt="Drupal 7" title="Drupal 7 is a whole new Drupal" class="imagecache-teaser_full" /><br /> <span class="image-caption">Drupal 7 is a whole new Drupal</span></p> <p>It has been a long time coming. Drupal 6 came out some 3 years ago. That in many ways was the time when Drupal emerged from relative obscurity, where it was known only by open source aficionados, PHP geeks and a few untold thousands of independent website owners who knew a good thing when they saw it, to a CMS recognized worldwide as one to be reckoned with. More powerful than Wordpress, more flexible than Joomla!, more affordable (and flexible and, in many ways, powerful) than proprietary systems like Vignette, Drupal 6 came on the scene the quiet hero to many site owners. <em>[Note: I mean no disparagement against Wordpress or Joomla!, which are active open source web software projects, and we like open source software! But each is different; describing how so is something to be left for another blog post another day.]</em></p> <p><a rel="lightbox[group1][954 people contributed to Drupal 7 in tangible ways. Brian &#039;brianv&#039; Vuyk can be found a little above Druplicon&#039;s right eye.]" href="http://pingv.com/f/blogimgs/d7-contributor-cloud-huge.png"><img src="http://pingv.com/f/imagecache/teaser_full/blogimgs/d7-contributor-cloud-huge.png" alt="Drupal 7 Contributors" class="imagecache-teaser_full" /></a></p> <p>We here in this shop have had the great fortune of being able to work with Drupal 6 on a number of projects — and each of us individually beforehand — playing a small part in a very large and impressive community.</p> <p>Drupal 7 promises to step everything up a notch.</p> <p>Right now, we have a couple of Drupal 7 projects in house that are in the last strategic planning and architecture phases, which means that we — and especially <a href="http://pingv.com/staff/brian-vuyk">Brian Vuyk</a>, who contributed <strong>33 patches to Drupal 7</strong> and, last year, took over the <a href="http://drupal.org/project/primary_term">Primary Term module</a>, while offering up and testing patches for a number of contributed modules — will be bringing a lot of time and attention to some interesting modules needing upgrades, as well as perhaps a new one or two. </p> <p>Meanwhile, as announced here before, the <a href="http://drupal.org/project/squaregrid" title="a base theme for Drupal 7">Square Grid theme</a> and the <a href="http://drupal.org/project/floater" title="base theme for Drupal 7">Floater theme</a> are both available for Drupal 7. (Confession time: They're still not tagged as official stable releases, but Square Grid is actually quite stable currently; Floater has some sprucing up for its 1.0 release. Expect stable releases of each very soon!)</p> <h3>How far we've come in just a few years!</h3> <p>I first discovered Drupal in 2004. I joined the community in November of that year. Back then, Drupal 4.5 was new. Theming was an order of magnitude more difficult than it is today. Modules did not have installation routines, you had to manually execute MySQL commands to add or update tables. PHP 4.whatever was the standard. You had to get into the code quite a bit to set up any kind of site.</p> <p>Since then, Drupal has grown. Ultimately, the test for Drupal 7 is just beginning. My expectation is that people will respond with enthusiasm and delight, and Drupal will continue its phenomenal growth with every major release.</p> <p>And yet this is open source, and <strong>the drop is always moving</strong>. <a href="http://drupal.org/project/issues/search/drupal?text=&amp;assigned=&amp;submitted=&amp;participant=&amp;status%5B%5D=Open&amp;priorities%5B%5D=1&amp;priorities%5B%5D=4&amp;priorities%5B%5D=2&amp;priorities%5B%5D=3&amp;categories%5B%5D=bug&amp;categories%5B%5D=task&amp;categories%5B%5D=feature&amp;categories%5B%5D=support&amp;version%5B%5D=572834&amp;issue_tags_op=or&amp;issue_tags=" title="Drupal 8 features, tasks, bugs, etc.">Drupal 8 is coming</a>!</p><div class="field field-type-nodereference field-field-related"> <div class="field-label">Related:&nbsp;</div> <div class="field-items"> <div class="field-item odd"> <a href="/blog/on-grids-in-design-and-announcing-the-square-grid-drupal-theme">On grids in design (and announcing the Square Grid Drupal theme)</a> </div> <div class="field-item even"> <a href="/blog/floater-theme-to-get-away-from-columns">Floater Theme to get away from columns</a> </div> <div class="field-item odd"> <a href="/blog/a-peek-at-drupal-7-theme-system-changes">A peek at Drupal 7 theme system changes</a> </div> </div> </div> http://pingv.com/blog/a-new-year-a-new-drupal-a-new-era#comments Drupal Drupal 7 Wed, 05 Jan 2011 18:27:05 +0000 Laura Scott 132 at http://pingv.com