Vim – search and replace

Gestern habe ich etwas gefunden, was man eigentlich schon früher entdecken hätte können. Und zwar folgendes, wenn man in Vim mit einem regulären Ausdruck sucht und ersetzt %s/SUCH-PATTERN/ERSETZE-PATTERN/ dann kann man mit einen & das SUCH-PATTERN in den Ersetzenteil einbauen, damit werden dann solche Konstrukte möglich %s/SUCH-PATTERN/ERSETZE-PATTERN1&ERSETZE-PATTERN1/. Geil.

Erfolgserlebnisse wo man hinsieht!

Der Sohn detektiert seinen eigenen Harndrang mittlerweile sehr zuverlässig und reagiert auch entsprechend. Größtes Hindernis im Ernstfall ist eine für ihn schwer zu öffnende Hose, weshalb er seit gut einer Woche nur noch Jogginghosen trägt. Mit diesem Status können erst mal alle ganz gut leben.

Der Vater vom Sohn ist mittlerweile mit der Andorid Entwicklung so weit vertraut, dass er die Idee, die er hatte, auch schon gut umgesetzt bekommen hat. Doch wie so oft stecken die Probleme im Detail – nichts desto trotz kann man die App schon mal als „funktional i.O.“ bezeichnen. Sie läuft seit Tagen (1,5 um genau zu sein) ohne Murren. Was jetzt noch fehlt sind, Konfigurationsdialoge, Dokumentation und das Schönifying, also die unendlichen letzten 10 %.

Theme fine tuning, heute: Datum + Uhrzeit

Heute wurde das Theme getunt und zwar wurde bisher die Uhrzeit, an dem ein Beitrag erstellt wurde, noch nicht angezeigt. Keine große Sache wird sich jetzt der ein oder andere denken, aber wenn man bedenkt das es sich dabei um ein Hybrid-Core-Theme handelt, dann wird die Sache schon komplizierter. Der Clou an dem Hybrid-Core ist nämlich, dass sich da ein Framework im Hintergrund um die angepasste Darstellung für Handies usw. kümmert. Der Preis den man dafür zahlt ist, dass man nicht mehr wie früher direkt in Seiten-Quellcode rummachen kann, weil dort fast ausschließlich nur noch Template-Aufrufe sind.

Das Mapping zwischen Template-Pattern und Funktionsaufruf-Aufruf erfolgt bei meinem Theme Plain WP in der Datei library/functions/shortcodes.php, dort wird in der Zeile 28 das Pattern "entry-published" auf eine Funktion gemappt:

/**     
 * Creates new shortcodes for use in any shortcode-ready area.  This function uses the add_shortcode()
 * function to register new shortcodes with WordPress.
 *      
 * @since 0.8.0
 * @access public
 * @uses add_shortcode() to create new shortcodes. 
 * @link http://codex.wordpress.org/Shortcode_API
 * @return void
 */
function hybrid_add_shortcodes() {
 
        /* Add theme-specific shortcodes. */
        add_shortcode( 'the-year',      'hybrid_the_year_shortcode' );
        add_shortcode( 'site-link',     'hybrid_site_link_shortcode' );
        add_shortcode( 'wp-link',       'hybrid_wp_link_shortcode' );
        add_shortcode( 'theme-link',    'hybrid_theme_link_shortcode' );
        add_shortcode( 'child-link',    'hybrid_child_link_shortcode' );
        add_shortcode( 'loginout-link', 'hybrid_loginout_link_shortcode' );
        add_shortcode( 'query-counter', 'hybrid_query_counter_shortcode' );
        add_shortcode( 'nav-menu',      'hybrid_nav_menu_shortcode' );

        /* Add entry-specific shortcodes. */
        add_shortcode( 'entry-title',         'hybrid_entry_title_shortcode' );
        add_shortcode( 'entry-author',        'hybrid_entry_author_shortcode' );
        add_shortcode( 'entry-terms',         'hybrid_entry_terms_shortcode' );
        add_shortcode( 'entry-comments-link', 'hybrid_entry_comments_link_shortcode' );
        add_shortcode( 'entry-published',     'hybrid_entry_published_shortcode' );

Und genau diese Funktion muss angepasst werden. Dazu wurde die Zeile 10 um ." @ ".get_option( 'time_format' ) erweitert. Das ist alles. Klingt einfach, dauert aber bis man sich durch den Quellcode durchgearbeitet hat…

/**
 * Displays the published date of an individual post.
 *
 * @since 0.7.0
 * @access public
 * @param array $attr
 * @return string
 */
function hybrid_entry_published_shortcode( $attr ) {
        $format_str= get_option( 'date_format' )." @ ".get_option( 'time_format' );
        $attr = shortcode_atts( array( 'before' => '', 'after' => '', 'format' => $format_str ), $attr );

        $published = '' . get_the_time( $attr['format'] ) . '';
        return $attr['before'] . $published . $attr['after'];
}

Hier nochmal der Unterschied:

Vorher Nachher
Bildschirmfoto 2013-08-22 um 16.15.52 -vohert Bildschirmfoto 2013-08-22 um 16.16.13

Hurra!

Das erste WordPress Widget

Ein WordPress Widget ist eigentlich recht einfach gebaut: man füllt ein Header Template aus (das wird gebraucht für die Auswahl in WordPress), ungefähr so:

< ?php
/*
Plugin Name: Geburtstags Widget
Plugin URI: https://hoadl.net
Description: Dieses Plugin stellt die Days To 40 Liste dar
Author: C Hack
Version: 1.0
Author URI: https://hoadl.net
*/

Schreibt dann in eine Funktion function sd_widget_profil_display() den Ausgabetext:

function sd_widget_profil_display()
{
    echo "hallo world";
}

Und registriert das Teil noch:

wp_register_sidebar_widget(
    'GeburtstagsWidget',        // your unique widget id
    'Geburtstags Widget',          // widget name
    'sd_widget_profil_display',  // callback function
    array(                  // options
        'description' => 'Plugin stellt die Days To 40 Liste dar'
    )
);
?>

Die fertige Datei muss in wp-content/plugins/ abgelegt werden, nachdem das Plugin im Admin-Bereich aktiviert wurde, erscheint es in der Auswahl und kann verwendet werden. Cool.

FRITZ!Box++

Das ist nicht komfortabel, aber es funktioniert und bringt Bezug zur Technik und fühlt sich so richtig geekig an: Google-Contacts To FRITZ!Box-XML Skript. Morgen führe ich meine Kontakte und die der Chefin zusammen. Und wenn dann mal wieder Zeit ist wird der Anrufmonitor ausprobiert und in dem Wiki gibt es bestimmt auch noch was.

Falls Apache noch nicht läuft weil das Laptop zu neu ist 🙂 Start Apache on OS X 10.8.2 und Enable PHP on OS X 10.8.2

How to create a xsl processing instruction with an attribut using xslt?

Mann, das ist wieder eines von den Problemen, die hast du genau einmal im Leben:

> How to create a xsl processing
> instruction with an attribut using xslt?
>
> Sample:
>
> I would like to create something like this
> < ?xml-stylesheet type="text/css" href="toto.xsl"?>

Processing instructions do not contain attributes. Some processing instructions, like this one, contain „pseudo-attributes“, but they are not recognized as attributes by the XML parser, by the infoset, or by the XPath data model. They are just text.

So you create them as text:

<xsl :processing-instruction name="xml-stylesheet">
  <xsl :text>type="text/css" 
  <xsl :text>href="
  <xsl :value-of select="$href"/>
  <xsl :text>"

Kompletten Thread gibt es hier: http://www.dpawson.co.uk/xsl/sect2/N6145.html#d8654e82

XML-Zeugs

Wo ich grade was über IBMs Feature Pack for XML lese fällt mir ein das ich neulich schon mal auf das XMLStarlet Command Line XML Toolkit hinweisen wollte. XMLStarlet is a set of command line utilities (tools) which can be used to transform, query, validate, and edit XML documents and files using simple set of shell commands in similar way it is done for plain text files using UNIX grep, sed, awk, diff, patch, join, etc commands.

Hört sich unspektakulär an, ist aber voll der Hammer wenn man z.B. mal schnell was in einem Sack voller XML Dateien machen muss und nicht großartig was programmieren will! Neulich habe ich z.B. mal en passant*) aus zig XML Dateien ein bestimmtes Element in eine Datei gepipt und konnte die Sache rel. leicht auswerten. Dafür habe ich von einem E-Techniker ähnliche Beachtung geerntet wie vor Jahren als in einem Webdesigner ein 2GB Logfile mit VI durchsucht hab… geil! Für solche Momente tauscht du jede Mastercard ein.

*) wie der Franzose sagt

Dropbox

Grade bin ich durch Zufall auf Dropbox gestoßen. Dropbox ist ein Online-Dienst bei dem man Dateien ablegen kann. Es gibt für verschiedene Betriebssystem Clients, die die Dateien im Online-Speicher mit einem Verzeichnis auf der Festplatte abgleichen, Ziel ist es auf verschiedenen Rechnern einen synchronen Datenstand hin zu bekommen. Clients gibt es für Windows, Mac und Linux.

Ich habe mir einen Account eingerichtet und den Client bei mir installiert, funktioniert. Jetzt bin ich hin und hergerissen – eigentlich ist das genau was ich brauche… allerdings weiß ich nicht genau wer dort so alles auf meine Daten Zugriff hat. Hmm, ob andere Leute ein paar Briefe an die Bank und ein paar Scans von Versicherungszeugs interessiert?