Tim’s Weblog Tim's Weblog
Tim Strehle’s links and thoughts on Web apps, managing software development and Digital Asset Management, since 2002.

A Companion for WoodWing Assets

At the SPIEGEL-Verlag, we use the WoodWing Assets DAM software in production since January 2020. Most of the images you see on spiegel.de (one of Germany’s largest news sites) are sent to our Web CMS from Assets.

WoodWing Assets is a pretty good DAM product, focused on a relatively small set of core features. There is little built-in business logic or connectors – instead, Assets provides a couple of extension mechanisms so you can customize it: Action plugins and Panel plugins (custom HTML + JavaScript embedded into the Assets UI), a REST APIWebhooks, and API plugins (a wrapper for custom REST services).

We made use of action and panel plugins to add functionality to the Assets UI (like dialogs for “advanced search” and Web CMS export). But there is also a bunch of “invisible” logic. Here are a few of our use cases:

Read the full article…

Sat, 14 Aug 2021 22:13:00 +0000

Open source PHP client for the WoodWing Assets (Elvis) REST API

In my role as “Project Manager for DAM systems” at the SPIEGEL-Verlag, I spent the last year helping to roll out the WoodWing Assets (formerly known as “Elvis”) DAM software. It’s not used for the print publication yet (as this premature press release suggests), but it powers most of the photos published on spiegel.de since the January relaunch.

We decided to open-source the Assets plugins and integrations we and our development partners built during this project – where it makes sense, and as our time permits.

The first open source code we’re publishing is this PHP client library for the Assets REST API:

DerSpiegel / ww_elvis_php_client on Github

Documentation and tests are still missing, but the library is stable (we’re using this code in production). It is pretty lightweight and can be used for one-off batch scripts.

If you have Docker Desktop installed, it’s easy to get started – you don’t need a server, virtual machine, or PHP runtime. This Docker / Composer command fetches the library and all its dependencies:

Read the full article…

Wed, 20 May 2020 14:45:00 +0000

First steps: A Symfony 4 PHP app in Docker

I’m currently learning Docker, and finding out how to develop a (new) Symfony 4 (PHP 7) application locally on my Mac and run it within a Docker container, instead of hosting it in a Linux VM in VMware Fusion as I used to do. Docker Desktop and the PhpStorm IDE are already installed.

Docker setup

I want to use official, current Docker images from the Docker Hub. A colleague convinced me (better scalability?) to use Nginx instead of my trusty old Apache Web server. So I need the nginx:latest and php:fpm images.

While I can use the Nginx image as-is, I need to create my own image on top of the PHP standard one since I will want to add PHP extensions as needed, and to run Composer in the container. I ended up with this Dockerfile:

Read the full article…

Mon, 10 Jun 2019 19:09:00 +0000

The story of my favorite bug

In the fifteenth year of my software developer career, I encountered a remarkable bug that would “entertain” me for weeks.

“Garbage in, garbage out”?

It started off rather innocuously: At a recently-installed customer site, I noticed that a few XML files sent from the editorial system weren’t imported correctly into our DAM system. The files were imported, but parts of the data looked bad.

My first assumption was that the editorial system had generated faulty files – “garbage in, garbage out.” But they seemed no different from successfully-imported files, and when I reimported the files that originally failed, the problem was gone.

I had no idea where to look and decided to live with the problem for a while. Each day, I checked for failed imports and manually triggered a reimport. But sooner or later I would have to find and fix the cause.

Read the full article…

Tue, 19 Mar 2019 21:45:00 +0000

Using XML to copy data from PostgreSQL to MySQL

Today, I needed to copy a few tables from a PostgreSQL database into a MySQL database. I wanted to use XML files to exchange the data so I could inspect and validate it easily.

I expected this to be a lot of work (including XSLT magic), but it was surprisingly easy: It turns out that PostgreSQL’s default XML output format is supported by MySQL out of the box!

Read the full article…

Wed, 06 Mar 2019 21:56:00 +0000

Clean Data is more important than Clean Code

In my experience, many software developers don’t care much about data modeling. They seem to prioritize clean code, a good technology stack and a good user interface over getting the data model right.

All of these are important, but the data model is the foundation:

You can refactor source code anytime, going from unclean to clean and back. You can even throw your UI and all of your code away, and replace your entire technology stack.

The only thing that will live on is the data you migrate into the new system – and most faults in your data model are impossible or impractical to fix. (Believe me; I made many wrong choices as a developer, and my data modeling mistakes had much more long-term impact than my bad coding.)

Data is forever:

Data you did not capture because there was no place for it in your data model will be lost forever.

Data with different semantics (like a photo’s “date taken” vs “date imported”) that you had to squeeze into the same column because your data model did not let you differentiate will be indistinguishable forever.

Data with different data types (is it plain text or HTML?) or encoding (UTF-8 or not?) that went into your database without any hint because there was no attribute for it in your data model (and no normalization step) will be messed up (and potentially insecure) forever.

First, get your data model right.

Sun, 17 Feb 2019 20:18:00 +0000

Playing with the Camunda workflow engine (and PHP)

A generic workflow engine, configured via a graphical diagram editor on top of an XML syntax – that’s what I tried and failed to develop more than 15 years ago. I did help build three generations of a simple “workflow” component integrated in our DAM product to drive asset ingestion and export, kept reading (see The State of Workflow and Decoupling Application Logic) and writing (Workflow awareness of DAM systems) about workflows – and hoping that one day, a powerful and beautiful workflow management system would make my work easier.

That’s why I was thrilled to discover Camunda, a workflow engine with an open source, free community edition. It is standards-based, written in Java, and comes with a Web UI, REST API and graphical process diagram modeler. Here’s a screenshot of Camunda Modeler:

Read the full article…

Sat, 01 Sep 2018 22:55:00 +0000

What to put on a DAM Admin dashboard

Imagine you introduce a shiny new Digital Asset Management (DAM) system in your company which can feed all kinds of metrics into the brightly-colored Grafana dashboard hanging on your wall.

What would you track on that dashboard to help you manage, grow and troubleshoot your DAM system? Off of the top of my head, these metrics could be important:

Read the full article…

Thu, 14 Jun 2018 13:34:00 +0000

The “X” in JSON stands for Extensibility

While I do use JSON, I still think XML is superior for some important use cases (long-lived data that may be exchanged with other systems). So here’s a quick “rant” – prompted by Dan Brickley’s response to Bob DuCharme’s Reification is a red herring – aimed at those (younger?) folks “dissing” XML :)

Over time, requirements and technology inevitably change. Extensibility (the “X” in XML) is the property that helps us adapt and keep pace, letting us evolve technology from simple to advanced without having to throw away and reimplement existing functionality. Here’s two reasons why XML is better at it than JSON:

From one to many

Cardinality (whether data has one or multiple values) is a common problem in data modeling: In a relational database, you need to change the schema (creating an additional table) to turn a single-valued into a multi-valued field. Programming languages distinguish between scalar values and arrays or collections.

Not so in XML; I can move effortlessly (on the producer side, at least) from single…

Read the full article…

Thu, 31 May 2018 12:22:00 +0000

Digital Asset Management Reading List Feb./Mar. 2018

This time, I cover two months at once: Here’s the Digital Asset Management (DAM) articles from February and March 2018 which I recommend reading. I picked them from the constant stream of blog posts you can see float by on Planet DAM. For more curated DAM links, see the weekly Digital Asset Management.com Links and Tracy Wolfe’s 10 things on the 10th.

I’m happy to see people write and talk about my pet topic, DAM interoperability. On DAM News, Ralph Windsor publishes The Politics Of Implementing Digital Asset Supply Chains: Parking The Enterprise Service Bus. Emily Kolvitz and Brian Kavanaugh present DAM Integrations 101 (video, 30 minutes). Matthew Patulski announces the “Advancing Findability” DAM NY conference session hosted by the W3C DAM schema.org community group.

More thoughts on the future of DAM come from Ramon Forster – Dropbox Is More Than a DAM – and from Dave Jones: What is a Content Services Platform? Jarrod Gingras hosts a webinar on the 8 DAM trends to watch in 2018.

Read the full article…

Wed, 11 Apr 2018 20:34:00 +0000