Tumblelog by Soup.io
Newer posts are loading.
You are at the newest post.
Click here to check if anything new just came in.

January 15 2012

Drupal as a Content Repository — a few months later

I’ve recently blogged about how we use Drupal as a Content Repository. I wanted to write a lessons learned follow up post to see what worked out and what we needed to adjust.

Where we are

We still use Drupal as a Content Repository and just consume it’s content data via webservices to let our application do the complicated rendering. We launched the external part of our content in November 2011 (see our Expat Magazine and our Country & City Guides) and the internal part in December (you need to request an account to see it). Development of both parts was smooth, but we reached some limits of what one can do with Drupal’s view module and we needed to adjust our “no custom code” to “as little custom code as possible”.


Continue reading "Drupal as a Content Repository — a few months later"

October 17 2011

Drupal as a Content Repository

As one of my first projects at InterNations we want to introduce rich content management functionality for internal usage. We have a custom made PHP application and want to publish a bunch of content to provide our customers with an even richer experience and greater service. Our requirements can be read along the lines of:

  • Provide an easy to use interface for content and media management for our editorial team
  • A limited set of fairly complex content types (multi page articles, etc.)
  • CMS features like versioning, custom attributes, workflows
  • Deep integration into our custom application
  • Halfway complex rules based on categories (or taxonomies, as Drupal takes it)
  • A few edits per day, not many per hour

Continue reading "Drupal as a Content Repository"

May 06 2011

Dependency Injection Container Refactorings, Part Two

This is part of a mini-series about typical refactorings when using DI containers. Read part one.


(c) Jil A. Brown

Introduce Parameter

When configuring objects you will stumble upon occurrences of duplicated configuration. As configuration duplication is as bad as code duplication, making refactorings and maintenance time-intense and error-prone, we try to avoid them. Occurrences I had, started from defining the same hosts over and over for different services and quasi hard-coded upload prefixes for files sprinkled all over my configuration. I will illustrate this refactoring with the image upload example. We configure Zend_File_Transfer and add a few validators to allow image uploads but only specific ones:

<?xml version="1.0"?>
<container>
   <services>
      <service id="fileTransferService" class="Zend_File_Transfer">
          …
         <call method="addValidator">
            <argument>Count</argument>
            …
            <argument>photo</argument>
         </call>
         <call method="addValidator">
            <argument>Size</argument>
            …
            <argument>photo</argument>
         </call>
         <call method="addValidator">
            <argument>MimeType</argument>
            …
            <argument>photo</argument>
         </call>
         <call method="addValidator">
            <argument>ImageSize</argument>
            …
            <argument>photo</argument>
         </call>
      </service>
   <services>
</container>

When adding validators to Zend_File_Transfer the fourth argument (in this case photo) is the name of the array key of the file. In our case the markup would look like this:

<input type="file" name="photo"/>

The specific key is important if you allow the upload of various file types in one request. Now we change the requirements and allow not only photos but photos and PDFs (in the same input as photos, so that the user does not need to use different inputs based on file formats). To not mislead the next programmer working on this piece of code, we should change the markup to something like this (give me a better name please):

<input type="file" name="photoOrPdf"/>

Now we open our container configuration and change every occurrence of “photo” to “photoOrPdf” and hope not to forget one. Except the one you’ll find out two month later. To avoid this duplication of configuration, we introduce a parameter and our container configuration changes.

<?xml version="1.0"?>
<container>
   <parameters>
       <parameter key="filePrefix">photoOrPdf</parameter>
   </parameters>
   <services>
      <service id="fileTransferService" class="Zend_File_Transfer">
          …
          <call method="addValidator">
             <argument>Count</argument>
             …
             <argument>%filePrefix%</argument>
          </call>
          <call method="addValidator">
             <argument>Size</argument>
             …
             <argument>%filePrefix%</argument>
          </call>
          <call method="addValidator">
             <argument>MimeType</argument>
             …
             <argument>%filePrefix%</argument>
          </call>
          <call method="addValidator">
             <argument>ImageSize</argument>
             …
             <argument>%filePrefix%</argument>
          </call>
       </service>
   </services>
</container>

To make things even more smooth we could inject that parameter into the view and into the controller to make sure, configuration value duplication is no longer an issue with this specific module.

Parametererize Service

Excluded, as I no longer think this is actually a good idea.

Allow Environment Specific configuration

When you have a development process where you pass several acceptance stages before an artefact goes into production, these stages are typically slightly different from each other. Starting from different service IP addresses over single machine vs. multi machine, there will definitely be some variance among them. Typical variances are:

  • Logger settings: severity filters, logging targets like file on development, syslog on the rest
  • Database settings master with fake slave a.k.a. read only database user on development, master slave on the rest
  • Error handling modes especially for more introspective components: “Hard fail” vs. “soft fail and log”
  • Caching: no caching on development, caching enabled on testing and production stages
  • Code generation and building: “rebuild on request” on development, once per deployment on testing and production

One way to do so is to sprinkle conditions all over your application and check on which host you are but that will lead to an application well beyond manageability. That’s why I was never happy (at least for large applications >100 person-days) with typical PHP application configurations like the preposterous config.inc.php. Having a touring complete programming language at hand for configuration will eventually introduce ugly conditionals making configurations unreadable. But I digress.

There are various models for stage configuration, including inheritance from each former stage, inheritance from a main configuration, standalone configuration and all mixes of these models. All of them are well implementable with the Symfony 2 dependency injection container. Let’s start with the most simplistic one, standalone configuration for each stage:

<?php
$container = new ContainerBuilder();
$loader = new XmlFileLoader($container, new FileLocator(…));
$loader->import($currentStage . '.xml');

A more complicated one is main configuration + override per stage:

<?php
$container = new ContainerBuilder();
$baseLoader = new XmlFileLoader($container, new FileLocator(…));
$baseLoader->import('main.xml');
$stageLoader = new XmlFileLoader($container, new FileLocator(…));
$stageLoader->import($currentStage . '.xml');

The most “complicated” would be linear inheritance, where testing extends development, staging extends testing and so on:

<?php
$container = new ContainerBuilder();
$loader = new XmlFileLoader($container, new FileLocator(…));
foreach (array('development', 'testing', 'staging', 'production') as $stage) {
    $loader->import($stage . '.xml');
    if ($stage == $currentStage) {
        break;
    }
}

With this kind of setup you can override configuration.

Example main.xml:

<?xml version="1.0"?>
<container>
   <parameters>
        <parameter key="database.name">application</parameter>
        …
   </parameter>
   <services>
       <service id="component" class="MyComponent"/>
       <service id="component2" class="MyComponent2"/>
   </services>
</container>

testing.xml with different database name and an alternative for component2:

<?xml version="1.0"?>
<container>
   <parameters>
        <parameter key="database.name">another_database</parameter>
   </parameter>
   <services>
      <service id="component2" class="MyAlternativeComponent2"/>
   </services>
</container>

April 22 2011

PECL mogilefs 0.9.0 released

I just released 0.9.0 of PECL mogilefs. This is release comes with a few but small API breaks. Basically whenever there was no open connection, we returned false in the past. We no longer do that, instead we throw an exception of type MogileFsException. So the API breakage will be fairly visible. The complete list of changes:

  • Adding new methods setReadTimeout(float readTimeout) and getReadTimeout(). This can be used to set a differing read timeout to the connect timeout. In the past releases, the connect timeout (to the tracker) was used as a read timeout (to the storage nodes). From my experience the read timeout should be a little bit higher than the connect timeout.
  • Remove PHP max version limit so we no longer have to release a new version when PHP is released. This is what other PECL packages are doing, so I think this will work better.
  • Comply with stricter c99 standard. Yeah, nerd stuff
  • Fixed tests and made them more robust. Try them: PHP_TEST_EXECUTABLE=<php> php tests.php
  • Optimized mogilefs_sock_read() and introduced maximum message size (based on a patch from Andre Pascha of kwick.de). Less allocs, less frees. Good stuff
  • MogileFs::put() throws more exceptions: as said before

Comments, ideas, patches and anything else are more than welcome. Have fun with this release.

April 19 2011

Dependency Injection Container Refactorings, Part One


(c) Jil A. Brown

Working heavily with the Symfony2 Dependency Injection Container, I feel that we found some typical refactorings towards a DI container that emerge during the introduction of such a component. I want to write down the preliminary results of trying to systematize more or less as a draft. I will use the Symfony2 DI container configuration as an example but most of the refactorings should be applicable to other containers as well, some of them even to dependency injection without a container.

Make Dependency Explicit

This is typically the first step towards Dependency Injection: make a dependency explicit. There are three typical ways to do so, first is constructor injection, second is setter injection and third and less preferred is property injection. I roughly prefer constructor injection for invariant dependency in my domain and setter injection for infrastructure (setNotifier e.g.). Consider this example:

<?php
namespace Example;
class Client
{
    public function execute()
    {
        $dependency = new Dependency();
        $dependency->execute();
    }
}

Client creates a new instance of Dependency and call execute(). Bad for testing and for configuration, Dependency will always be hard coded there. To make it easier manageable we refactor towards setter injection:

<?php
namespace Example;
class Client
{
    public function setDependency(Dependency $dependency)
    {
        $this->_dependency = $dependency;
    }
 
    public function execute()
    {
        $this->_dependency->execute();
    }
}

Now we can manage Client in the DI container like this:

<?xml version="1.0"?>
<container xmlns="http://www.symfony-project.org/schema/dic/services">
    <services>
        <service name="example.client" class="Example\Client">
            <call method="setDependency">
                <argument type="service">
                    <service class="Example\Dependency"/>
                </argument>
            </call>
        </service>
    </services>
</container>

We see that the dependency is explicit: we specifically configure Example\Client and pass a specific Example\Dependency object.

Introduce Interface Injection

After a number of Explicit Dependency refactorings our configuration file for the service container will become huge. We will notice that we have common dependencies that are used at various places, an event manager for example. To fix that rapid growth we choose to utilize Interface Injection to ease configuration.

This is the configuration starting point:

<?xml version="1.0"?>
<container xmlns="http://www.symfony-project.org/schema/dic/services">
    <services>
        <service name="example.client" class="Example\Client">
            <call method="setDependency">
                <argument type="service">
                    <service class="Example\Dependency"/>
                </argument>
            </call>
        </service>
        <service name="example.anotherClient" class="Example\AnotherClient">
            <call method="setDependency">
                <argument type="service">
                    <service class="Example\Dependency"/>
                </argument>
            </call>
            <call method="setOtherDependency">
                <argument type="service">
                    <service class="Example\OtherDependency"/>
                </argument>
            </call>
        </service>
    </services>
</container>

We notice that both Example\Client and Example\AnotherClient depend on Example\Dependency. First of all we need an interface contracting setDependency. This is basically the Extract Interface refactoring. We call the newly extracted interface Example\DependencyAware.

The interface:

<?php
namespace Example;
interface DependencyAware
{
    public function setDependency(Dependency $dependency);
}

And we refactor both Example\Client and Example\AnotherClient to implement Example\DependencyAware.

Now we change our configuration to call setDependency no longer explicitly for Example\Client and Example\AnotherClient but for every object implementing Example\DependencyAware.

<?xml version="1.0"?>
<container xmlns="http://www.symfony-project.org/schema/dic/services">
    <services>
        <service name="example.client" class="Example\Client"/>
        <service name="example.anotherClient" class="Example\AnotherClient">
            <call method="setOtherDependency">
                <argument type="service">
                    <service class="Example\OtherDependency"/>
                </argument>
            </call>
        </service>
    </services>
    <interfaces>
        <interface class="Example\DependencyAware">
            <call method="setDependency">
                <argument type="service">
                    <service class="Example\Dependency"/>
                </argument>
            </call>
        </interface>
    </interfaces>
</container>

Expose Service

Really simple, but …
Expose Service is applied when a service has been only a dependency but should be used as a top level service. We start with the well known example:

<?xml version="1.0"?>
<container xmlns="http://www.symfony-project.org/schema/dic/services">
    <services>
        <service name="example.client" class="Example\Client">
            <call method="setDependency">
                <argument type="service">
                    <service class="Example\Dependency"/>
                </argument>
            </call>
        </service>
    </services>
</container>

Consider we want to expose Example\Dependency as a service directly, we need to change from the configuration above to
reference the service by ID.

<?xml version="1.0"?>
<container xmlns="http://www.symfony-project.org/schema/dic/services">
    <services>
        <service name="example.dependency" class="Example\Dependency"/>
        <service name="example.client" class="Example\Client">
            <call method="setDependency">
                <argument type="service" id="example.dependency"/>
            </call>
        </service>
    </services>
</container>

Simple.

Next topics would be: Introduce Parameter, Parametererize Service and Allow Environment Specific configuration

February 19 2011

PECL MogileFs 0.8.1 released

On Wednesday I 0.8.1 of PECL MogileFs has been released. The new version features a few important changes and fixes:

  • Changing timeout parameter for MogileFs::connect() to float to allow specifying microseconds. This is an important change if you want to do connection pooling for your trackers in PHP. You can now limit the time the client tries to connect to a tracker and connect to an alternative one if this fails
  • Connect timeout does not set read timeout. This change became necessary with the better connect timeout handling and is the whole reason there is a 0.8.1. The previous assumption was to reuse the connect timeout as read timeout. This is no longer feasible. If somebody needs the functionality of setting a specific read timeout, I would be happy to implement that as a specific option though. I personally have no use for it.
  • Fixing arginfo for MogileFs::put(). You dawg, I’ve heard you like reflections. So I’ve put some reflection into your reflection so you can reflect while you reflect
  • Adding read timeout handling. Andre Pascha of Kwick provided a patch for better read timeout handling. Previously read timeouts were silently ignored, this behavior has been fixed. Thanks!
  • Adding EOF check before reading/writing to a socket (Andre Pascha)

Also it’s marked as “beta” I’m fairly confident with this release. We already upgraded production environments on the newest version, so you could too.

Tags: MogileFS PECL PHP

February 02 2011

Suizidal

Die GWUP, die Gesellschaft zur wissenschaftlichen Erforschung von Parawissenschaften, plant kommenden Samstag massenweißes Homöopathie-Pillen-Geschlucke. In München wird auch geschluckt.

(via Kristian Köhntopp)

September 05 2010

PHP segfaulting with pecl/uuid and pecl/imagick

Ran into a bug yesterday, where http://pecl.php.net/uuid in combination with http://pecl.php.net/imagick yielded a segfault when using uuid_create(). GDB backtrace looks like this (without the exact place where it happens in libuuid, as there is unfortunatly no libuuid1-dbg-package in current Ubuntu versions):

gdb --silent --ex run --args php -r "var_dump(uuid_create());"
#0  0xb6e85321 in ?? () from /lib/libuuid.so.1
#1  0xb6e862bf in uuid_generate () from /lib/libuuid.so.1
#2  0xb6bcc67a in zif_uuid_create (ht=0, return_value=0xbffff1e8, return_value_ptr=0x0, this_ptr=0x0, return_value_used=1) at /usr/src/pecl-uuid-trunk/uuid.c:182
#3  0x0835d26a in zend_do_fcall_common_helper_SPEC (execute_data=0x894ed4c) at /build/buildd/php5-5.3.2/Zend/zend_vm_execute.h:313
#4  0x08333d8e in execute (op_array=0x891c464) at /build/buildd/php5-5.3.2/Zend/zend_vm_execute.h:104
#5  0x082fe283 in zend_eval_stringl (str=0xbffff998 "var_dump(uuid_create());", str_len=24, retval_ptr=0x0, string_name=0x871f2fc "Command line code")
    at /build/buildd/php5-5.3.2/Zend/zend_execute_API.c:1172
#6  0x082fe422 in zend_eval_stringl_ex (str=0xbffff998 "var_dump(uuid_create());", str_len=24, retval_ptr=0x0, string_name=0x871f2fc "Command line code", handle_exceptions=1)
    at /build/buildd/php5-5.3.2/Zend/zend_execute_API.c:1214
#7  0x082fe4a3 in zend_eval_string_ex (str=0xbffff998 "var_dump(uuid_create());", retval_ptr=0x0, string_name=0x871f2fc "Command line code", handle_exceptions=1)
    at /build/buildd/php5-5.3.2/Zend/zend_execute_API.c:1225
#8  0x083a0579 in main (argc=3, argv=0xbffff854) at /build/buildd/php5-5.3.2/sapi/cli/php_cli.c:1235

The interesting thing is, the crash happens in libuuid, but only if imagick is enabled. Let’s see what Valgrind says:

valgrind -q  php -r "var_dump(uuid_create());"
==25103== Invalid write of size 2
==25103==    at 0x5517321: ??? (in /lib/libuuid.so.1.3.0)
==25103==    by 0x55182BE: uuid_generate (in /lib/libuuid.so.1.3.0)
==25103==    by 0x57D0679: zif_uuid_create (uuid.c:182)
==25103==    by 0x835D269: zend_do_fcall_common_helper_SPEC (in /usr/bin/php5)
==25103==    by 0x8333D8D: execute (/build/buildd/php5-5.3.2/Zend/zend_vm_execute.h:104)
==25103==    by 0x82FE282: zend_eval_stringl (/build/buildd/php5-5.3.2/Zend/zend_execute_API.c:1172)
==25103==    by 0x82FE421: zend_eval_stringl_ex (/build/buildd/php5-5.3.2/Zend/zend_execute_API.c:1214)
==25103==    by 0x82FE4A2: zend_eval_string_ex (/build/buildd/php5-5.3.2/Zend/zend_execute_API.c:1225)
==25103==    by 0x83A0578: main (/build/buildd/php5-5.3.2/sapi/cli/php_cli.c:1235)
==25103==  Address 0x30 is not stack'd, malloc'd or (recently) free'd
==25103== 
==25103== 
==25103== Process terminating with default action of signal 11 (SIGSEGV)
==25103==  Access not within mapped region at address 0x30
==25103==    at 0x5517321: ??? (in /lib/libuuid.so.1.3.0)
==25103==    by 0x55182BE: uuid_generate (in /lib/libuuid.so.1.3.0)
==25103==    by 0x57D0679: zif_uuid_create (uuid.c:182)
==25103==    by 0x835D269: zend_do_fcall_common_helper_SPEC (in /usr/bin/php5)
==25103==    by 0x8333D8D: execute (/build/buildd/php5-5.3.2/Zend/zend_vm_execute.h:104)
==25103==    by 0x82FE282: zend_eval_stringl (/build/buildd/php5-5.3.2/Zend/zend_execute_API.c:1172)
==25103==    by 0x82FE421: zend_eval_stringl_ex (/build/buildd/php5-5.3.2/Zend/zend_execute_API.c:1214)
==25103==    by 0x82FE4A2: zend_eval_string_ex (/build/buildd/php5-5.3.2/Zend/zend_execute_API.c:1225)
==25103==    by 0x83A0578: main (/build/buildd/php5-5.3.2/sapi/cli/php_cli.c:1235)
==25103==  If you believe this happened as a result of a stack
==25103==  overflow in your program's main thread (unlikely but
==25103==  possible), you can try to increase the size of the
==25103==  main thread stack using the --main-stacksize= flag.
==25103==  The main thread stack size used in this run was 8388608.
Segmentation fault

Not really any more helpful. After two hours debugging the issue with the help of Mikko and Pierre we found out, that pecl/imagick is linked against libuuid too:

ldd /usr/lib/php5/20090626+lfs/imagick.so
    (...)
    libuuid.so.1 => /lib/libuuid.so.1 (0xb7086000)
    (...)

For whatever reason this is happening, this is most likely the root cause of the issue.

Solution (sort of)

pecl/uuid was loaded by /etc/php5/conf.d/uuid.ini and pecl/imagick by /etc/php5/conf.d/imagick.ini. As they are loaded in there alphabetical order, imagick initialized before uuid. Renaming /etc/php5/conf.d/uuid.ini to /etc/php5/conf.d/00-uuid.ini fixed the issue, as uuid is than initialized before imagick and the segmentation fault was gone.
Not sure about that, but maybe it would be a good idea to check in PHP_MINIT(uuid) in pecl/uuid if pecl/imagick has been initialized before and warn the user about it?

August 01 2010

Proof of Concept: Binary packed UUIDs as primary keys with Doctrine2 and MySQL

The Problem

For a project I need non-guessable synthetic primary keys. I will use them to construct URIs and these URIs need to be non-guessable. If I would use the traditional way of doing so, going the down the route of integer primary keys with auto increments, or using a sequence table an attacker could easily increment or decrement the integer to find some similar items. Next idea was to use UUIDs or GUIDs. These identifiers are globally unique, so this would work for primary keys too. Reading some documentation on the topic brought up the interesting issue of space usage. Storing the UUIDs in a CHAR column would be a huge waste of space compared to an integer primary key. As primary keys are referenced in related table, this would be a huge issue. Finally I found a trick storing there binary representation in a BINARY column. Doing that in MySQL is fairly easy:

INSERT INTO items SET id = UNHEX(REPLACE(UUID(), '-', '');

Selecting a human readable reasult is easy too:

SELECT HEX(id) FROM items;

Achieving the same thing in PHP is pretty straightforward too. You need the PECL extension UUID (pecl install uuid) and pack()/unpack():

<?php
$uuid = uuid_create(UUID_TYPE_TIME);
$uuid = str_replace("-", "", $uuid);
var_dump(pack('H*', $uuid));
string(16) "?Irp??ߐ
                   )??m"

Converting them back into there hex representation is similar:

<?php
var_dump(array_shift(unpack('H*', $binaryUuid)));
string(32) "d2f268509db211df9010000c29abf06d"

Doctrine2 integration

Next step would be integration with Doctrine2. To do so, we need to create a custom mapping type. I’m not using Doctrine2 for database abstraction, but for it’s object relational mapping capabilities so I ignore portability and concentrate on MySQL.

<?php
namespace Lars\Doctrine2\Types\Mysql;
use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;
 
class BinaryType extends Type
{
    const BINARY = 'binary';
 
    public function getSqlDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
    {
        return sprintf('BINARY(%d)', $fieldDeclaration['length']);
    }
 
    public function getName()
    {       
        return self::BINARY;
    }   
      
    public function convertToPhpValue($value, AbstractPlatform $platform)
    {
        if ($value !== null) {
            $value= unpack('H*', $value);
            return array_shift($value);
        }
    }
 
    public function convertToDatabaseValue($value, AbstractPlatform $platform)
    {
        if ($value !== null) {
            return pack('H*', $value);
        }
    }
}

Now we are introducing the new type to Doctrine2 somewhere in our setup logic:

<?php
use Doctrine\DBAL\Types\Type;
Type::addType('binary', 'Lars\Doctrine2\Types\Mysql\BinaryType');

One issue I stumbled upon was the default Doctrine2 does. With MySQL it maps binary types to intermediate blob types (in the Doctrine2 type system). This default behavior is not configurable, so we need to patch Doctrine\DBAL\Schema\MySqlSchemaManager. I’m sure there is a more elegant way and I would love to receive some remarks here:

            case 'tinyblob':
            case 'mediumblob':
            case 'longblob':
            case 'blob':
            /** 
             * Commented out to make our custom mapping work
             * case 'binary':
             */         
            case 'varbinary':
                $type = 'blob';
                $length = null;
                break;

Last part is our entity:

<?php
namespace Lars\User\Domain;
 
/**
 * @Entity
 * @Table(name="user",indexes={@Index(name="user_email_idx",columns={"user_email"})})
 * @HasLifecycleCallbacks
 */
class User
{
    /**
     * @Id
     * @Column(type="binary",length=16,name="user_id")
     * @GeneratedValue(strategy="NONE")
     */
    protected $_id;
 
    /**
     * @Column(type="string",length=32,name="user_email")
     */
    protected $_email;
 
    public function changeEmail($email)
    {
        $this->_email = $email;
        return $this;
    }
 
    public function getId()
    {
        return $this->_id;
    }
 
    /**
     * @PrePersist
     */
    public function generateUuid()
    {
        $this->_id = str_replace('-', '', uuid_create(UUID_TYPE_TIME));
    }
}

The important part here is the createUuid()-method to generate the UUID once before persisting the domain object. With GeneratedValue(strategy="NONE") we told Doctrine not to generate the ID by itself and with HasLifecycleCallbacks we configure Doctrine to scan for lifecycle callback methods, so that generateUuid() will be called before persisting the entity.

Fetching an object by ID is as easy as ever, but don’t forget to convert the ID:

$user = $em->find(
    'Lars\User\Domain\User',
    pack('H*', '16aec29e9db011df8013000c29abf06d')
);

Further ideas

The whole UUID should be refactored towards an UUID value object to encapsulate UUID creation and binary conversion.

July 13 2010

April 06 2010

April 05 2010

April 04 2010

April 02 2010

February 16 2010

December 31 2009

Meine Lieblingsalben 2000 – 2009

Zur Jahrenswende ist es Zeit auf die letzten zehn Jahre Popmusik zu schauen. Allen ein gutes neues Jahr zu wünschen, wann auch immer es in den jeweiligen Kalendern beginnt.

20 Matisyahu Youth 2005

Matisyahu – Youth

19 Joanna Newsom Ys 2006

Joanna Newsom — Ys

18 The Shins Oh, Inverted World 2001

The Shins - Oh, Inverted World

17 Rufus Wainwright Release the Stars 2007

Rufus Wainwright - Release the Stars

16 Architecture in Helsinki Fingers Crossed 2003

Architecture in Helsinki - Fingers Crossed

15 Morrissey Years of Refusal 2009

Morrissey - Years of Refusal

14 Editors The Back Room 2005

Editors - The Back Room

13 The Kooks Inside In/Inside Out 2006

12 Gossip Standing in the Way of Control 2006

Gossip – Standing in the Way of Control

11 The Good, The Bad & The Queen The Good, The Bad & The Queen 2007

The Good, The Bad & The Queen - The Good, The Bad & The Queen

10 The Knife Deep Cuts 2003

The Knife – Deep Cuts

09 Element of Crime Mittelpunkt der Welt 2005

08 Bloc Party Intimacy 2008

07 Arctic Monkeys Whatever People Say I Am, That's What I’m Not 2006

Arctic Monkeys — Whatever People Say I Am, That's What I’m Not

06 Maxïmo Park Our Earthly Pleasures 2007

05 Johnny Cash American V: A Hundred Highways 2000

Cover: Johnny Cash – American V: A Hundred Highways

Mit der Veröffentlichung von American V: A Hundred Highway nach dem Tod Johnny Cashs geht ein Stück Musikgeschichte zu Ende. Die American Recordings-Serie zeigt Cash auf dem Höhepunkt seines musikalischen Schaffens. Wer hat nicht wenigstens eins dieser Stück gehört und nicht wieder vergessen: The Beast In Me, Bird On A Wire, I See a Darkness, I Won’t Back Down, The Mercy Seat, Solitary Man.

Den Tracks des letzten Albums ist der Gesundheitszustand Cashs aufgeprägt: seine brüchige Stimme verstärkt die Melancholie, die der ganzen Serie anhaftet. Unvergessen das Celebrity-Tribute-Video zu God’s Gonna Cut You Down.

Die letzte Platte ist nicht die beste der Serie, sie ist aber sicher die beeindruckenste. Ob aus pragmatisch-ökonomischen Gründen, wie bei Veröffentlichung gelästert wurde, oder aus edleren Motiven: ein Album zu veröffentlichen, auf dem deutlich zu hören ist, dass es das letzte sein wird, zwingt den Zuhörer zu irgendeiner Art von Reaktion. Und wem Cashs Musik etwas bedeutet, der wird gerade dieses Album in seiner bitteren Süße genießen.

04 Modest Mouse Good News for People Who Love Bad News 2004

Modest Mouse – Good News for People Who Love Bad News

Wenn wir schon bei Rockmusik sind: im Sommer 2007 empfahl mir ein Bekannter Modest Mouse als ein wenig verspult aber interessanter Sound. Und er meinte nicht nicht picky-interessant, sondern interessant-interessant. Also hörte ich mir das an und reagierte erstmal zurückhaltend. Ja, lustiger Albumtitel, ja, Musik ist Okay aber mehr war erstmal nicht. Aus heute nicht mehr nachvollziehbaren Gründen hörte ich das Album aber weiterhin an und irgendwann gefiel es dann doch. Sogar ziemlich gut. Jedenfalls so gut, dass ich kurz darauf Modest Mouse live sah, mir den Rest Ihrer Alben besorgte und immer weiter hörte.

Good News for People Who Love Bad News klingt wie heiser und aggresiv – wie Musik manchmal sein muss. Die Gitarren schrammeln, das Schlagzeug treibt, Rockstruktur halt.

Lieblingstitel

  • 02: World At Large
  • 03: Float On
  • 06: Bury Me With It
  • 08: Bukowski

03 Eels Souljacker 2001

Eels – Souljacker

Life ain’t pretty for a dog faced boy heißt es im Refrain von Dog Faced Boy. Life ain’t pretty for the E man würde genauso passen.

Mark Oliver Everett hat mit Eels bis heute eine Reihe von Platten hingelegt, die so unfassbar gut sind, dass selbst die schlechten noch die musikalische Konkurrenz bei weitem übertreffen. Aber über die schlechteren wollen wir nicht reden, wir reden über Souljacker. Souljacker ist deswegen so interessant, weil es all dass, das Eels kann, auf eine Platte presst. Da geht es krächzend los mit Dog Faced Boy und That’s not Really Funny, dann folgen Fresh Feeling und Woman Driving, Man Sleeping ganze ruhige Stücke, die sogar mit Streichern umso besser funktionieren, nur um wieder von einem klassischen Rock-Arrangement, nämlich Souljacker I, abgelöst zu werden. In Friendly Ghost verschmelzen die beiden Stilrichtungen und werden angereichtet mit Elementen des Folk zu einem netten 3:23 Stückchen.

Zwischen 2000 und 2009 sind ganze sieben Eels-Alben erschienen, nur eines zu loben wäre unaufrichtig. Souljacker ist die Verdichtung aller anderen Alben, die hier aber nicht unerwähnt bleiben sollen. Wer den symphonischen Teil weiter kennenlernen will, kann auf With Strings: Live at Town Hall Neuinterpretationen der Eels-Stücke mit Orchester lauschen, wem nach poppigen Arrangements zu Mute ist, der wird mit Daisies of the Galaxy glücklich.

02 Tocotronic Kapitulation 2007

Tocotronic – Kapitulation

Der deutschen Poplandschaft entsprießten um die Jahrtausendwende ein Haufen musikalisch und textlich ausbaufähiger Bands wie Juli, Echt, Silbermond oder Revolverheld. Ausbaufähig ist eine freundliche Untertreibung, solcher Quatsch sucht seinesgleichen. Diese Bands mussten immer betonen, wie sehr sie von Tocotronic beeinflusst wurden. Diese Entwicklung griffen Tocotronic 2002 mit ihrem Album Tocotronic, auch als Weißes Album bekannt, auf. Sicher auch aus dem Bedürfnis der Abgrenzung heraus wurde die vormalige Sloganhaftigkeit mehr und mehr verdrängt durch diffizilere, lyrische Texte.

Reise nach 2007: Seit 1998 war die Schröder-Regierung an der Macht: Deutschland war im Reformfieber, seitdem wird gefördert und gefordert, ohne Eigeninitiative geht gar nichts mehr. In dieses Treiben hinein veröffentlichte Tocotronic 2007 ihren Aufruf, den Quatsch einfach mal sein zu lassen. Nicht als aufdringliche Liedermacher-Dichtung, sondern als höflicher Schubser, wegzulaufen, sich zu verstecken – eben zu kapitulieren, wenn man es nicht mehr aushält.

Der Klang der Platte ist, trotzdem sie als Themenalbum angelegt ist, typisch für die ehemaligen Neulinge der Hamburger Schule: gitarrenlastig, roh. Über den Klangteppich breitet sich die Nichtstimme von Dirk von Lowtzow, die mal brüchig und zurückhaltend wie in Dein geheimer Name oder stampfend wie in Sag alles ab das stimmliche Spektrum der Band beleuchtet. Die Platte kann einfach als Rockmusik gehört werden, als poetisches Album voller versteckter Referenzen oder eben als auch als politisches Konzeptalbum. Die Vorgänger-Alben waren richtig und wichtig, doch nie war Tocotronic auch musikalisch so gut.

Lieblingstitel

  • 02: Kapitulation
  • 06: Harmonie ist eine Strategie
  • 10: Sag alles ab

01 Arcade Fire Neon Bible 2007

Arcade Fire – Neon Bible

Mit Neon Bible zeigten Arcade Fire 2007 was sie können: ungewöhnliche Arrangments an den Genre-Grenzen von Folk und Rock unterlegt mit ungewöhnlichen Instrumenten wie Orgel und Akkordeon. Was auf dem Vorgänger Funeral schon anklang, Dunkelheit, Hysterie, drückende Hitze, wird hier zur Perfektion getrieben. Wer behauptet, nach Pink Floyd könne im Pop niemand mehr Songs die Anmutung von Opern-Arien geben, sieht sich getäuscht. Der Qualität von Neon Bible können auch die in reaktionäre Sehnsucht sich wendenden Texte kaum etwas anhaben: zu berauschend, zu atemberaubend ist die Schönheit dieser Aufnahme.

Und weil ich in den letzten zehn Jahren einfach kein Album gehört habe, dass mich dermaßen gefesselt hat, muss es auf Platz 1 landen.

Lieblingstitel

  • 01: Black Mirror
  • 03: Neon Bible
  • 04: Intervention
  • 11: My Body is a Cage

October 28 2009

October 10 2009

Happy little Karsten
Older posts are this way If this message doesn't go away, click anywhere on the page to continue loading posts.
Could not load more posts
Maybe Soup is currently being updated? I'll try again automatically in a few seconds...
Just a second, loading more posts...
You've reached the end.