<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xml:base="http://bluedroplet.com" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
 <title>Blue Droplet Media - Jonathan Brown</title>
 <link>http://bluedroplet.com/blog/planet_drupal</link>
 <description>Blue Droplet Media Blog - Planet Drupal posts</description>
 <language>en</language>
<item>
 <title>DrupalCamp Edinburgh this Saturday</title>
 <link>http://bluedroplet.com/blog/drupalcamp-edinburgh-saturday</link>
 <description>&lt;div style=&quot;float: right; margin-left: 10px; margin-bottom: 10px;&quot;&gt;
&lt;img src=&quot;http://bluedroplet.com/files/imagecache/story_image/199.jpg&quot; alt=&quot;&quot; title=&quot;&quot;  class=&quot;imagecache imagecache-story_image&quot; /&gt;&lt;/div&gt;
&lt;p&gt;DrupalCamp Edinburgh is this Saturday @ the Informatics Forum: &lt;a href=&quot;http://dcedinburgh.drupalscotland.org/&quot; title=&quot;http://dcedinburgh.drupalscotland.org/&quot;&gt;http://dcedinburgh.drupalscotland.org/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It&#039;s free and the tracks are Beginners, Community and Business.&lt;/p&gt;
&lt;p&gt;They&#039;ve lined up loads of great sessions: &lt;a href=&quot;http://dcedinburgh.drupalscotland.org/program/session-schedule&quot; title=&quot;http://dcedinburgh.drupalscotland.org/program/session-schedule&quot;&gt;http://dcedinburgh.drupalscotland.org/program/session-schedule&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There is free coffee and lunch, but you have to register by 5pm on 18th May.&lt;/p&gt;
&lt;p&gt;There is also an afterparty @ Sneaky Pete&#039;s: &lt;a href=&quot;http://www.facebook.com/event.php?eid=149619238439720&quot; title=&quot;http://www.facebook.com/event.php?eid=149619238439720&quot;&gt;http://www.facebook.com/event.php?eid=149619238439720&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you&#039;re down south, Drupal7Camp Leeds is the same weekend: &lt;a href=&quot;http://2011.drupal7camp.org/&quot; title=&quot;http://2011.drupal7camp.org/&quot;&gt;http://2011.drupal7camp.org/&lt;/a&gt;&lt;/p&gt;
</description>
 <category domain="http://bluedroplet.com/tags/planet-drupal">planet drupal</category>
 <enclosure url="http://bluedroplet.com/files/199.jpg" length="286944" type="image/jpeg" />
 <pubDate>Mon, 16 May 2011 15:34:15 +0000</pubDate>
 <dc:creator>jbrown</dc:creator>
 <guid isPermaLink="false">1681 at http://bluedroplet.com</guid>
</item>
<item>
 <title>Why management needs to understand the Drupal community to fully benefit from Drupal</title>
 <link>http://bluedroplet.com/blog/why-management-needs-understand-drupal-community-fully-benefit-drupal</link>
 <description>&lt;div style=&quot;float: right; margin-left: 10px; margin-bottom: 10px;&quot;&gt;
&lt;/div&gt;
&lt;p&gt;The slogan of the new &lt;a href=&quot;http://drupal.org/&quot;&gt;Drupal website&lt;/a&gt; is:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Come for the software, stay for the community&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is the typical process by which people learn that Drupal&#039;s ultimate strength is its community, rather than its code base.&lt;/p&gt;
&lt;p&gt;Websites are like human beings - any two websites can be very different and do very different things, but under the hood they are 99% the same. Any website (large or small) has very small unique code base, compared to the enormous software stack that it sits upon. Other components in the stack are typically:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;kernel, e.g. Linux - 13.5 million lines of code (mainly device drivers)&lt;/li&gt;
&lt;li&gt;database, e.g. MySQL - 1.7 million&lt;/li&gt;
&lt;li&gt;webserver, e.g. Apache - 450,000&lt;/li&gt;
&lt;li&gt;HTTP accelerator, e.g. Varnish - 78,000&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The operating system distribution itself is even larger, e.g. Debian has about 32,000 software packages, totalling almost half a billion lines of code. Of course, only some of these packages would be involved in running a given website. At a lower level, even more is going on in hardware.&lt;/p&gt;
&lt;p&gt;Regardless of what your website is doing, all of the above components will be typical and you will probably not be reinventing any of them from scratch. Drupal core (275,000 lines) is just another component in the stack. But, as small as Drupal is compared to the rest of the software stack, it is still a very large piece of software that has taken a decade to develop. The functionality that Drupal provides is also reusable for just about any kind of website.&lt;/p&gt;
&lt;p&gt;Drupal has the experience of having been deployed hundreds of thousands of times. It works around so many weird security problems and software incompatibilities to provide a robust plateau on which to build your site.&lt;/p&gt;
&lt;p&gt;On top of Drupal core sits the contributed modules - these are further reusable components. There are about 6,000 of these totalling about 10 million lines of code. Of course, you should only use a few dozen modules at most on any one site.&lt;/p&gt;
&lt;p&gt;The trick is, to have as much of the functionality provided by reusable, community or contractually supported, open source components as possible. From the operating system right up to the contributed modules. Write as little private code as possible and only do so as a last resort. It should sit at the top of the stack, like the skin of an apple. If you need some new functionality that someone else might need, write a module and &lt;a href=&quot;http://drupal.org/contribute/development&quot;&gt;contribute&lt;/a&gt; it back to the community.&lt;/p&gt;
&lt;p&gt;Time and time again I have seen companies using Drupal, but having no understanding of how to utilise it correctly. It is not a technical understanding that is required, but rather a social one. Developers will download Drupal and whatever modules they like the look of, and go off on their own, making modifications to get Drupal to do exactly what they want and failing to benefit from the following advantages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Popular modules are always getting better and better. For a company to fully benefit from improvements they make to a module, these improvements need to become part of the module on drupal.org. In order for the code to be incorporated, it will be peer reviewed and improved. Others will build upon it. This also removes the burden of maintaining a &#039;fork&#039;. Updating core and modules to the latest release is considerably harder if a developer has hacked it.
&lt;/li&gt;
&lt;li&gt;
If you are having a problem with a popular module, there are probably many others having the same problem - making it much easier to get to the bottom of it in the issues queue.
&lt;/li&gt;
&lt;li&gt;
New engineers can be be parachuted into your site and know exactly what they are doing. They are already experts with the modules that you use. Time and money doesn&#039;t need to be wasted getting them up to speed with your bespoke effort.
&lt;/li&gt;
&lt;li&gt;
Increasingly, Drupal provides functionality that is more abstract in nature. New content types used to have to be created in a custom module - now this can be done by an administrator through a point and click interface. More and more can be done without any programming. &lt;a href=&quot;http://drupal.org/project/views&quot;&gt;Views&lt;/a&gt; and &lt;a href=&quot;http://drupal.org/project/panels&quot;&gt;Panels&lt;/a&gt; are examples of this.
&lt;/li&gt;
&lt;li&gt;
Higher quality code - it takes a lot of time and effort to write code that is of really high quality. When code is staying private within an organisation it will be of much lower quality. Publishing forces developers to do a good job. Cutting corners with poor quality code is never a good investment.
&lt;/li&gt;
&lt;li&gt;
Security - if a considerable number of organisations are using the same code, then there is a much greater collective effort to make sure it is secure. Private code simply can&#039;t compete with this.
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Developers need to fully utilise the Drupal community to their benefit. The best way for this to happen is for management to understand this. This means they can instil a culture within their organisation to engage with the community, and also to permit this to happen. Developers need to be able to participate in the community without fearing that management would not understand.&lt;/p&gt;
&lt;p&gt;How can developers and management best come to have an understanding of the community and how best utilise it? Come to Drupal events like &lt;a href=&quot;http://chicago2011.drupal.org/&quot;&gt;DrupalCon&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A further advantage of management understanding the Drupal community, is that they will probably see that it is much less dysfunctional than their own organisation. The Drupal community has extremely high levels of transparency. Almost everything (except security issues) are discussed in public. This has enabled the Drupal community to be a extremely effective engineering and decision-making machine. Something to be envied by almost every other organisation in the world.&lt;/p&gt;
&lt;p&gt;There are a couple of other blog posts on similar topics:&lt;br /&gt;
&lt;a href=&quot;http://www.garfieldtech.com/blog/pay-it-forward&quot; title=&quot;http://www.garfieldtech.com/blog/pay-it-forward&quot;&gt;http://www.garfieldtech.com/blog/pay-it-forward&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.lullabot.com/articles/best-practices-in-open-source-development&quot; title=&quot;http://www.lullabot.com/articles/best-practices-in-open-source-development&quot;&gt;http://www.lullabot.com/articles/best-practices-in-open-source-developme...&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[lines of code source: &lt;a href=&quot;http://www.ohloh.net/&quot; title=&quot;http://www.ohloh.net/&quot;&gt;http://www.ohloh.net/&lt;/a&gt; ]&lt;/p&gt;
</description>
 <category domain="http://bluedroplet.com/tags/open-source">open source</category>
 <category domain="http://bluedroplet.com/tags/planet-drupal">planet drupal</category>
 <pubDate>Mon, 03 Jan 2011 19:52:04 +0000</pubDate>
 <dc:creator>jbrown</dc:creator>
 <guid isPermaLink="false">1680 at http://bluedroplet.com</guid>
</item>
<item>
 <title>Proposal for fixing PHP namespacing in Drupal 8</title>
 <link>http://bluedroplet.com/blog/proposal-fixing-php-namespacing-drupal-8</link>
 <description>&lt;div style=&quot;float: right; margin-left: 10px; margin-bottom: 10px;&quot;&gt;
&lt;/div&gt;
&lt;h2&gt;Collisions with non-Drupal PHP code&lt;/h2&gt;
&lt;p&gt;In theory, although I have never see this happen, a PHP library that Drupal is utilising could declare a function or class that is already declared in Drupal. This would cause PHP to abort.&lt;/p&gt;
&lt;p&gt;PHP 5.3 has a solution - namespaces (&lt;a href=&quot;http://php.net/manual/en/language.namespaces.php&quot; title=&quot;http://php.net/manual/en/language.namespaces.php&quot;&gt;http://php.net/manual/en/language.namespaces.php&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Drupal 8 should require PHP 5.3 - it was released 2009-06-30. Drupal 7 requires 5.2 and may just get released this year. When will D8 be released? Probably 2012 or 2013 - by then PHP 5.3 will be 3 or 4 years old.&lt;/p&gt;
&lt;p&gt;Every PHP file that is part of Drupal would be in the &#039;drupal&#039; namespace. This would be declared at the top of every PHP file as follows:&lt;/p&gt;
&lt;p&gt;&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php&lt;br /&gt;namespace drupal;&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Because all of Drupal is in its own namespace, there is no possibility of function or class name collisions.&lt;/p&gt;
&lt;p&gt;We are already prefixing many functions with drupal_ - this can simply be dropped from such function declarations.&lt;/p&gt;
&lt;p&gt;The new Database API in D7 is not really part of Drupal - it can be used without the rest of Drupal with only a few minor changes. It is a standalone library, and as such it should be in its own namespace:&lt;/p&gt;
&lt;p&gt;&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;namespace drupaldb;&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;the db_ prefix could then be dropped from all function declarations in the library.&lt;/p&gt;
&lt;h2&gt;Modules and themes&lt;/h2&gt;
&lt;p&gt;Modules and themes (and engines) would have a namespace such as &lt;/p&gt;
&lt;p&gt;&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;namespace drupal\taxonomy;&lt;/code&gt;&lt;/div&gt; or&lt;br /&gt;
&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;namespace drupal\bartik;&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Function prefixes, such as &#039;taxonomy_&#039; would be dropped.&lt;/p&gt;
&lt;p&gt;However, this makes Drupal code really ugly.&lt;/p&gt;
&lt;p&gt;Calling functions not in a module from a module would look like this:&lt;/p&gt;
&lt;p&gt;&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;\drupal\set_message();&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Calling a db function would look like this:&lt;/p&gt;
&lt;p&gt;&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;\drupaldb\select(&amp;#039;node&amp;#039;);&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Calling an API function in another module would look like:&lt;/p&gt;
&lt;p&gt;&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;\drupal\taxonomy\select_nodes();&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;The solution? Namespace importing.&lt;/p&gt;
&lt;p&gt;Every PHP file in a module would need to declare which namespaces it needs to access, e.g.&lt;/p&gt;
&lt;p&gt;&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php&lt;br /&gt;namespace drupal\node;&lt;br /&gt;use drupal, drupaldb as db;&lt;br /&gt;use drupal\taxonomy;&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;This means the above examples would look like:&lt;/p&gt;
&lt;p&gt;&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;drupal\set_message();&lt;br /&gt;db\select(&amp;#039;node&amp;#039;);&lt;br /&gt;taxonomy\select_nodes();&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Which is really quite pleasant!&lt;/p&gt;
&lt;p&gt;Calling a function that is in the current namespace would not require any prefixing. For example, calling \drupal\node\access_needs_rebuild() from inside namespace &#039;drupal\node&#039; would be invoked as:&lt;/p&gt;
&lt;p&gt;&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;access_needs_rebuild();&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Namespace importing should not be confused with module dependencies - importing is specified on a per-file basis.&lt;/p&gt;
&lt;h2&gt;Magic functions (hook implementations)&lt;/h2&gt;
&lt;p&gt;There are a couple of namespacing issues that can occur with magic functions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ambiguity of where the module name ends and the hook name begins, e.g. views_comment_load() - is the hook &#039;comment_load&#039; or &#039;load&#039;?&lt;/li&gt;
&lt;li&gt;Modules can inadvertently implement a hook for some other module.
&lt;/li&gt;&lt;li&gt;Multiple modules can &#039;invent&#039; the same hook, expecting it to do different things&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Solution: use __&lt;/p&gt;
&lt;p&gt;Magic functions would take one of the following forms:&lt;/p&gt;
&lt;p&gt;&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;INVENTOR__HOOK()&lt;br /&gt;INVENTOR__HOOK__PARAM()&lt;br /&gt;INVENTOR__HOOK__PARAM1__PARAM2() etc&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;INVENTOR is the name of the module that &#039;invented&#039; the magic function.&lt;br /&gt;
HOOK is the name of the hook, e.g. form_alter.&lt;br /&gt;
PARAM is for additional parameters, e.g. the name of the form to be altered.&lt;/p&gt;
&lt;p&gt;e.g.&lt;br /&gt;
&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;system__menu()&lt;br /&gt;block__info()&lt;br /&gt;system__form_alter__search_form()&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Only magic functions can have __ in their name. Modules, hook names [updated] and parameters are not allowed to have a double underscore. Drupal should not permit any machine name to have a double underscore.&lt;/p&gt;
&lt;p&gt;A further advantage of this is that the name of a magic function for a specific hook would be the same in every module that implements the hook. This helps code portability - example hook implementations could be put in place simply by cutting and pasting code.&lt;/p&gt;
&lt;h2&gt;Theme / process / preprocess implementations&lt;/h2&gt;
&lt;p&gt;These are also magic functions.&lt;/p&gt;
&lt;p&gt;The hook name is &#039;theme&#039; / &#039;process&#039; / &#039;preprocess&#039;.&lt;/p&gt;
&lt;p&gt;A module that declares a theme hook in a system__theme() is considered the &#039;inventor&#039; of the magic function.&lt;/p&gt;
&lt;p&gt;&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;theme_user_list($variables)&lt;/code&gt;&lt;/div&gt;becomes&lt;br /&gt;
&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;user__theme__list($variables)&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;in both the module that invented it and in themes that are overriding it.&lt;/p&gt;
&lt;p&gt;A module / engine / theme could implement a preprocess hook like:&lt;/p&gt;
&lt;p&gt;&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;system__preprocess__page()&lt;br /&gt;system__preprocess__links__contextual__node()&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;The second example is for the &#039;fallback&#039; theme items described &lt;a href=&quot;http://api.drupal.org/api/drupal/includes--theme.inc/function/theme/7&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Example&lt;/h2&gt;
&lt;p&gt;The attached node.module has been modified to incorporate this proposal (and a few other code style changes).&lt;/p&gt;
</description>
 <category domain="http://bluedroplet.com/tags/drupal8">drupal8</category>
 <category domain="http://bluedroplet.com/tags/namespacing">namespacing</category>
 <category domain="http://bluedroplet.com/tags/php">php</category>
 <category domain="http://bluedroplet.com/tags/planet-drupal">planet drupal</category>
 <enclosure url="http://bluedroplet.com/files/node.module.namespaced" length="127222" type="application/octet-stream" />
 <pubDate>Fri, 10 Dec 2010 01:53:28 +0000</pubDate>
 <dc:creator>jbrown</dc:creator>
 <guid isPermaLink="false">1679 at http://bluedroplet.com</guid>
</item>
<item>
 <title>Advanced exception handling in Drupal 7</title>
 <link>http://bluedroplet.com/blog/advanced-exception-handling-drupal-7</link>
 <description>&lt;div style=&quot;float: right; margin-left: 10px; margin-bottom: 10px;&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Earlier this year Drupal core developers were getting a strange error message while developing Drupal 7:&lt;/p&gt;
&lt;p&gt;&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;Fatal error: Exception thrown without a stack frame in Unknown on line 0&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;This was causing a lot of head scratching because it doesn&#039;t provide any information about what caused it.&lt;/p&gt;
&lt;p&gt;Drupal 7 uses &lt;a href=&quot;http://en.wikipedia.org/wiki/Exception_handling&quot;&gt;exceptions&lt;/a&gt; more than any previous version of Drupal and this turned out to be the problem.&lt;/p&gt;
&lt;p&gt;PHP exceptions are handled in one of two ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A function further down the call stack catches the exception in a try{} catch{}.&lt;/li&gt;
&lt;li&gt;The exception reaches the bottom of the call stack and the exception handler (_drupal_exception_handler() in Drupal 7) is invoked.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unfortunately there are certain contexts of PHP execution where the exception handler will not be invoked - causing the above error to be output:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;exception handler (already)&lt;/li&gt;
&lt;li&gt;session save handler&lt;/li&gt;
&lt;li&gt;registered shutdown function&lt;/li&gt;
&lt;li&gt;class destructor method invoked during PHP shutdown&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;My &lt;a href=&quot;http://drupal.org/node/742246&quot;&gt;patches&lt;/a&gt; to fix contexts 1 - 3 are in Drupal 7. The solution involved each of these contexts having their own try{} catch{} block so that the function had a &lt;a href=&quot;http://en.wikipedia.org/wiki/Exception_guarantees&quot;&gt;no throw guarantee&lt;/a&gt;. In this situation, details about the exception are now output in a very simple manner and are not logged so nothing further can go wrong. For the case of already being in the exception handler, both the original exception and the addition one are output.&lt;/p&gt;
&lt;p&gt;There isn&#039;t a general solution for context 4. Class destructors should not throw exceptions.&lt;/p&gt;
</description>
 <category domain="http://bluedroplet.com/tags/exceptions">exceptions</category>
 <category domain="http://bluedroplet.com/tags/planet-drupal">planet drupal</category>
 <pubDate>Tue, 21 Sep 2010 14:42:05 +0000</pubDate>
 <dc:creator>jbrown</dc:creator>
 <guid isPermaLink="false">1677 at http://bluedroplet.com</guid>
</item>
<item>
 <title>Use Git submodules to avoid storing Drupal core and contrib modules in your site&#039;s repository</title>
 <link>http://bluedroplet.com/blog/use-git-submodules-avoid-storing-drupal-core-and-contrib-modules-your-sites-repository</link>
 <description>&lt;div style=&quot;float: right; margin-left: 10px; margin-bottom: 10px;&quot;&gt;
&lt;/div&gt;
&lt;p&gt;In addition to whatever custom modules / themes are required, a typical code repository for a Drupal website also contains Drupal core and stock contrib modules. This makes repositories for Drupal websites much heavier than they need to be. It shouldn&#039;t be necessary for these external projects to be checked in - they already have their own repositories on drupal.org.&lt;/p&gt;
&lt;p&gt;I have developed a technique to avoid this using &lt;a href=&quot;http://book.git-scm.com/5_submodules.html&quot;&gt;Git submodules&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here is how it works:&lt;/p&gt;
&lt;p&gt;Start by cloning drupal-git-base. This is a simple Git project I created that contains drupal core as a submodule and some scripts.&lt;br /&gt;
&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;git clone --recursive git://github.com/bluedroplet/drupal-git-base.git mysite.com&lt;br /&gt;cd mysite.com&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;The --recursive option means that submodules will also be cloned, so Drupal core gets cloned from git://git.drupalcode.org/project/drupal.git .&lt;/p&gt;
&lt;p&gt;If you don&#039;t want to be using Drupal HEAD, you need to checkout a specific tag (optional):&lt;br /&gt;
&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;cd drupal&lt;br /&gt;git tag # see what tags are available&lt;br /&gt;git checkout 7.0-alpha7&lt;br /&gt;cd ..&lt;br /&gt;git add drupal&lt;br /&gt;git commit -m &amp;quot;Checkout drupal 7.0-alpha7.&amp;quot;&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;We need to make a copy of the &#039;sites&#039; directory outside the submodule that we can check in. The setup script creates a symlink from the drupal tree to it.&lt;/p&gt;
&lt;p&gt;&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;mv drupal/sites/ .&lt;br /&gt;./setup&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Now install Drupal in the normal way.&lt;/p&gt;
&lt;p&gt;Next we need to add our &#039;sites&#039; directory to the repository:&lt;br /&gt;
&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;git add sites&lt;br /&gt;git commit -m &amp;quot;Add sites directory.&amp;quot;&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Modules can be added as follows:&lt;br /&gt;
&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;git submodule add git://git.drupalcode.org/project/devel.git sites/all/modules/devel&lt;br /&gt;cd sites/all/modules/devel/&lt;br /&gt;git tag # see what tags are available&lt;br /&gt;git checkout 7.x-1.0-beta2&lt;br /&gt;cd ../../../..&lt;br /&gt;git add sites/all/modules/devel/&lt;br /&gt;git commit -m &amp;quot;Add devel-7.x-1.0-beta2.&amp;quot;&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;This is the procedure for making a clone of your repository:&lt;br /&gt;
&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;git clone --recursive mysite.com test&lt;br /&gt;cd test&lt;br /&gt;./setup&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;If you want to run modified versions of core or modules then a patchset can either be maintained in your superproject, or you can maintain your own git clone of the project(s).&lt;/p&gt;
&lt;p&gt;Unfortunately there is currently a problem with using Git submodules in this way - Drupal&#039;s update system doesn&#039;t know what contrib module and theme versions are being used. When you download a release from drupal.org it has version information in the .info file, but this is not in the repository.&lt;/p&gt;
&lt;p&gt;Two things need to happen to fix this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.info files need to have the release version information added in the drupalcode.org repository when they are tagged, not just in the downloadable tarballs.
&lt;/li&gt;&lt;li&gt;The new CVS to Git migration script needs to do this retroactively.
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;However, Drupal core does have the correct version information in the repository.&lt;/p&gt;
&lt;p&gt;Another problem is that you cannot use &lt;a href=&quot;http://drupal.org/project/drush&quot;&gt;Drush&lt;/a&gt; to update modules. You need to enter the module&#039;s directory, perform a git pull and then checkout the desired version. This is pretty easy, but not as easy as Drush.&lt;/p&gt;
&lt;p&gt;So what I currently recommend is that people use drupal-git-base, but do not use the Git submodule functionality for modules and themes. Check them in the old-fashioned way.&lt;/p&gt;
</description>
 <category domain="http://bluedroplet.com/tags/git">git</category>
 <category domain="http://bluedroplet.com/tags/planet-drupal">planet drupal</category>
 <pubDate>Fri, 17 Sep 2010 01:14:41 +0000</pubDate>
 <dc:creator>jbrown</dc:creator>
 <guid isPermaLink="false">1676 at http://bluedroplet.com</guid>
</item>
<item>
 <title>Storage API now supports Amazon CloudFront RTMP streaming</title>
 <link>http://bluedroplet.com/blog/storage-api-now-supports-amazon-cloudfront-rtmp-streaming</link>
 <description>&lt;div style=&quot;float: right; margin-left: 10px; margin-bottom: 10px;&quot;&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;http://drupal.org/project/bd_video&quot;&gt;Blue Droplet Video&lt;/a&gt; and &lt;a href=&quot;http://drupal.org/project/storage_api&quot;&gt;Storage API&lt;/a&gt; now support &lt;a href=&quot;http://en.wikipedia.org/wiki/Real_Time_Messaging_Protocol&quot;&gt;RTMP&lt;/a&gt; streaming with &lt;a href=&quot;http://aws.amazon.com/cloudfront/&quot;&gt;Amazon CloudFront&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The &#039;Stream with CloudFront&#039; option can be enabled when creating an S3 container, or when editing an existing one. You need CloudFront enabled in your &lt;a href=&quot;http://aws.amazon.com/&quot;&gt;AWS&lt;/a&gt; account. Streaming with CloudFront will not work immediately as it takes several minutes to setup a CloudFront distribution.&lt;/p&gt;
&lt;p&gt;Streaming will only work with MP4 video. The old FLV format is not supported.&lt;/p&gt;
&lt;p&gt;This functionality requires the latest development snapshots of &lt;a href=&quot;http://drupal.org/project/flowplayer&quot;&gt;Flowplayer&lt;/a&gt;, BDV and Storage API. You can try it out at &lt;a href=&quot;http://www.sharkscopers.com/&quot;&gt;SharkScopers&lt;/a&gt;.&lt;/p&gt;
</description>
 <category domain="http://bluedroplet.com/tags/cloudfront">cloudfront</category>
 <category domain="http://bluedroplet.com/tags/planet-drupal">planet drupal</category>
 <category domain="http://bluedroplet.com/tags/storageapi">storage_api</category>
 <pubDate>Thu, 28 Jan 2010 15:13:26 +0000</pubDate>
 <dc:creator>jbrown</dc:creator>
 <guid isPermaLink="false">1672 at http://bluedroplet.com</guid>
</item>
<item>
 <title>Storage API now supports Amazon CloudFront</title>
 <link>http://bluedroplet.com/blog/storage-api-now-supports-amazon-cloudfront</link>
 <description>&lt;div style=&quot;float: right; margin-left: 10px; margin-bottom: 10px;&quot;&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;http://drupal.org/project/storage_api&quot;&gt;Storage API&lt;/a&gt; now supports serving with &lt;a href=&quot;http://aws.amazon.com/cloudfront/&quot;&gt;Amazon CloudFront&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;CloudFront is the CDN for &lt;a href=&quot;http://aws.amazon.com/s3/&quot;&gt;Amazon S3&lt;/a&gt;. It has 14 edge locations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;United States - Ashburn, VA; Dallas/Fort Worth, TX; Los Angeles, CA; Miami, FL; Newark, NJ; Palo Alto, CA; Seattle, WA; St. Louis, MO&lt;/li&gt;
&lt;li&gt;Europe - Amsterdam; Dublin; Frankfurt; London&lt;/li&gt;
&lt;li&gt;Asia - Hong Kong; Tokyo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To use CloudFront, you need the latest development snapshot of Storage API. It will be in Storage API 6.x-1.2 when it is released.&lt;/p&gt;
&lt;p&gt;The &#039;Serve with CloudFront&#039; option can be enabled when creating an S3 container, or when editing an existing one. You need CloudFront enabled in your &lt;a href=&quot;http://aws.amazon.com/&quot;&gt;AWS&lt;/a&gt; account. Serving with CloudFront will not start immediately as it takes several minutes to setup a CloudFront distribution. CloudFront is polled during cron and S3 is used for serving until it is setup.&lt;/p&gt;
&lt;p&gt;Secure serving (time limited, cryptographically signed URLs - like with S3) is supported by CloudFront, but this is not yet implemented in Storage API.&lt;/p&gt;
</description>
 <category domain="http://bluedroplet.com/tags/cloudfront">cloudfront</category>
 <category domain="http://bluedroplet.com/tags/planet-drupal">planet drupal</category>
 <category domain="http://bluedroplet.com/tags/storageapi">storage_api</category>
 <pubDate>Sat, 23 Jan 2010 04:21:01 +0000</pubDate>
 <dc:creator>jbrown</dc:creator>
 <guid isPermaLink="false">1671 at http://bluedroplet.com</guid>
</item>
<item>
 <title>Showcase: SharkScopers</title>
 <link>http://bluedroplet.com/blog/showcase-sharkscopers</link>
 <description>&lt;div style=&quot;float: right; margin-left: 10px; margin-bottom: 10px;&quot;&gt;
&lt;img src=&quot;http://bluedroplet.com/files/imagecache/story_image/sharkscopers_0.png&quot; alt=&quot;&quot; title=&quot;&quot;  class=&quot;imagecache imagecache-story_image&quot; /&gt;&lt;/div&gt;
&lt;p&gt;One of the best sites that uses &lt;a href=&quot;http://drupal.org/project/bd_video&quot;&gt;Blue Droplet Video&lt;/a&gt; and &lt;a href=&quot;http://drupal.org/project/storage_api&quot;&gt;Storage API&lt;/a&gt; is &lt;a href=&quot;http://www.sharkscopers.com/&quot;&gt;SharkScopers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I wrote up a &lt;a href=&quot;http://drupal.org/node/672802&quot;&gt;showcase&lt;/a&gt; detailing how I helped &lt;a href=&quot;http://www.sharkscope.com/&quot;&gt;SharkScope&lt;/a&gt; put it together.&lt;/p&gt;
</description>
 <category domain="http://bluedroplet.com/tags/planet-drupal">planet drupal</category>
 <category domain="http://bluedroplet.com/tags/sharkscopers">sharkscopers</category>
 <enclosure url="http://bluedroplet.com/files/sharkscopers_0.png" length="740756" type="image/png" />
 <pubDate>Sun, 03 Jan 2010 21:06:03 +0000</pubDate>
 <dc:creator>jbrown</dc:creator>
 <guid isPermaLink="false">1670 at http://bluedroplet.com</guid>
</item>
<item>
 <title>Planet Drupal TV</title>
 <link>http://bluedroplet.com/blog/planet-drupal-tv</link>
 <description>&lt;div style=&quot;float: right; margin-left: 10px; margin-bottom: 10px;&quot;&gt;
&lt;img src=&quot;http://bluedroplet.com/files/imagecache/story_image/planetdrupal.tv_0.png&quot; alt=&quot;&quot; title=&quot;&quot;  class=&quot;imagecache imagecache-story_image&quot; /&gt;&lt;/div&gt;
&lt;p&gt;I have created a new site called &lt;a href=&quot;http://planetdrupal.tv/&quot;&gt;Planet Drupal TV&lt;/a&gt; that aggregates Drupal video feeds in a manner similar to how Planet Drupal aggregates Drupal blog posts. Videos can be viewed in-browser or downloaded. There is a &quot;most popular&quot; section that utilizes the fantastic &lt;a href=&quot;http://drupal.org/project/radioactivity&quot;&gt;Radioactivity&lt;/a&gt; module.&lt;/p&gt;
&lt;p&gt;It utilizes my &lt;a href=&quot;http://drupal.org/project/bd_video&quot;&gt;Blue Droplet Video&lt;/a&gt; module and its &lt;a href=&quot;http://drupal.org/project/feedapi&quot;&gt;Feed API&lt;/a&gt; integration.&lt;/p&gt;
&lt;p&gt;I&#039;ve added all the Drupal video feeds I could find, although it does not work with YouTube feeds as they do not use the enclosure tag. &lt;a href=&quot;http://www.getmiro.com/&quot;&gt;Miro&lt;/a&gt; can acquire video from YouTube, so it should be possible in future. Really, &lt;a href=&quot;http://blip.tv/&quot;&gt;blip.tv&lt;/a&gt; is much better than YouTube, or you could use Blue Droplet which outputs the source video in the enclosure tag.&lt;/p&gt;
</description>
 <category domain="http://bluedroplet.com/tags/planet-drupal">planet drupal</category>
 <category domain="http://bluedroplet.com/tags/planetdrupaltv">planetdrupal.tv</category>
 <enclosure url="http://bluedroplet.com/files/planetdrupal.tv_0.png" length="441763" type="image/png" />
 <pubDate>Tue, 28 Apr 2009 20:53:56 +0000</pubDate>
 <dc:creator>jbrown</dc:creator>
 <guid isPermaLink="false">1634 at http://bluedroplet.com</guid>
</item>
<item>
 <title>OpenPackage Video now supports H.264 video</title>
 <link>http://bluedroplet.com/blog/openpackage-video-now-supports-h264-video</link>
 <description>&lt;div style=&quot;float: right; margin-left: 10px; margin-bottom: 10px;&quot;&gt;
&lt;img src=&quot;http://bluedroplet.com/files/imagecache/story_image/H264_0.png&quot; alt=&quot;&quot; title=&quot;&quot;  class=&quot;imagecache imagecache-story_image&quot; /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;http://drupal.org/node/351782&quot;&gt;OpenPackage Video 5.x-3.15&lt;/a&gt; has been released.&lt;/p&gt;
&lt;p&gt;The major new feature of this release is MP4 encoding with H.264 video and AAC audio. These codecs have much higher performance than than the old FLV and MP3. This means you can have the same quality for less bandwidth or higher quality for the same bandwidth.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://openpackage.biz/video/927/leona-lewis-forgive-me&quot;&gt;Demo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;MP4 encoding is supported both with FFmpeg transcoding on your own server and with the paid transcoding service we offer at openpackage.biz .&lt;/p&gt;
&lt;p&gt;This functionality was sponsored by &lt;a href=&quot;http://sharkscopers.com/&quot;&gt;SharkScopers&lt;/a&gt; and &lt;a href=&quot;http://vertikal.dk/&quot;&gt;vertikal.dk&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;You can select the MP4 format under &#039;transcoding parameters&#039; in the video field configuration. You need to have run update.php if upgrading.&lt;/p&gt;
&lt;p&gt;For MP4 videos, the user must have Flash 9 or greater to play MP4. OpenPackage Video automatically ensures that a recent enough version is installed.&lt;/p&gt;
&lt;p&gt;If you are handling transcoding on your own server using FFmpeg, you need to make sure that your installation of FFmpeg has the required codecs. Once you have upgraded to 5.x-3.15, go to admin/settings/op_video . Important output formats and codecs are now highlighted. Make sure you can output the libfaac audio codec and the libx264 video codec. You also need qt-faststart, which is bundled with FFmpeg. See our &lt;a href=&quot;http://openpackage.biz/documentation/ffmpeg&quot;&gt;FFmpeg documentation&lt;/a&gt; for more info.&lt;/p&gt;
&lt;p&gt;Of course, if you use our remote transcoding service, you don&#039;t have to worry about configuring FFmpeg.&lt;/p&gt;
</description>
 <category domain="http://bluedroplet.com/tags/h264">h264</category>
 <category domain="http://bluedroplet.com/tags/opvideo">op_video</category>
 <category domain="http://bluedroplet.com/tags/planet-drupal">planet drupal</category>
 <enclosure url="http://bluedroplet.com/files/H264_0.png" length="87454" type="image/png" />
 <pubDate>Sun, 28 Dec 2008 13:12:32 +0000</pubDate>
 <dc:creator>jbrown</dc:creator>
 <guid isPermaLink="false">1512 at http://bluedroplet.com</guid>
</item>
</channel>
</rss>

