Quantcast
Channel: blog@hasselba.ch
Viewing all 169 articles
Browse latest View live

Krautreporter: Nur noch 9 Tage

$
0
0

Zur Zeit läuft ein Experiment namens “Krautreporter“: Ein Versuch, eine neue Form des Onlinejournalismus zu etablieren und dessen derzeit desolaten Zustand zu sanieren. Vielleicht sogar ein bisschen Rebellion gegen die bestehenden Strukturen im Verlagswesen, indem die Unabhängigkeit von Journalisten wieder etwas hergestellt wird.

15.000 Unterstützer müssen monatlich 5 € investieren, um ein werbefreies und qualitativ anspruchsvolles Onlinemagazin zu finanzieren. Ohne die ständige Jagd nach Besucherzahlen durch dümmlichen Klickstrecken. Und ohne den Druck, die Werbepartner oder gar den Arbeitgeber zu vergraulen.

Gleichzeitig hört man seit Jahren, dass die meisten ja gerne bereit wären, für qualitativ hochwertigen Journalismus zu bezahlen. Und man hört auch immer die gleichen Begründungen, weshalb ein AdBlocker verwendet wird: Man möchte seine Daten schützen, man möchte nicht mit Werbung zugemüllt werden, und man würde ja spenden, wenn dies irgendwie möglich wäre. Es sollte daher eigentlich ein leichtes sein, die nötigen Anzahl an Unterstützern zusammen zu trommeln, und das Magazin zu finanzieren.

Bisher jedoch sieht es gar nicht gut aus: Noch nicht einmal die Häfte der nötigen Finanziers hat sich gefunden. Die aktuelle Ausrede ist, man könne ja nur mit Kreditkarte mitmachen. Zwar könne man eine Kreditkarten auch Prepaid erwerben, dazu müsste man jedoch an der Tankstelle vorbei. Ein bischen mehr Aktion als nur einen Mausklick. Was wahrscheinlich der gelebten Bequemlichkeit entgegensteht.

Und so scheint sich wieder einmal zu Bewahrheiten, dass es eben nur Ausreden sind: Man will gar nicht bezahlen. Man ist eigentlich mit dem Status quo zu frieden. Hauptsache, man findet wieder irgendeine scheinheilige Begründung, warum man dagegen ist.

Hier zehn Gründe, das Experiment zu unterstützen. Und hier kann man Prepaid-Kreditkarten ergattern. (Die Karte nach Nutzung einfach wegwerfen. Alternativ nie wieder benutzen. Und schon stimmt die Privatsphäre wieder).

Ich unterstütze Krautreporter


The Voices Told Me To Do It!

$
0
0

1. “Create a new com.ibm.xsp.context.FacesContextExImpl!”

2. “Add all required classed to the build path!”

3. “Add a useless message to the constructor!”

4. “BUILD IT!”

5. “Open the original Jar!”

6. “In WinRAR!”

7. “Overwrite the existing classes!”

8. “Quick! Start the server!”

9. “And open a XPage!”

10. “Look! It is fulfilled!”

WordPress 3.9.1: Bug mit Copy & Paste von Bildern aus Zwischenablage

WordPress 3.9.1: Fix für Bug mit Copy & Paste von Bildern aus Zwischenablage

$
0
0

Um das Problem zu beheben, muss der Konfigurationsparameter paste_data_images für den TinyMCE Editor auf true gesetzt werden. Dazu kann man folgendes tun:

In der Datei /wp-includes/class-wp-editor.php folgende Zeile ergänzen:

init["paste_data_images"] = true;

Zu finden ist die richtige Stelle dafür in diesem Code-Block (ca. Zeile 1135):

.....

/**
* Fires after tinymce.js is loaded, but before any TinyMCE editor
* instances are created.
*
* @since 3.9.0
*
* @param array $mce_settings TinyMCE settings array.
*/
     do_action( 'wp_tiny_mce_init', self::$mce_settings );

?>
<script type="text/javascript">
<?php

     if ( self::$ext_plugins )
          echo self::$ext_plugins . "\n";

     if ( ! is_admin() )
          echo 'var ajaxurl = "' . admin_url( 'admin-ajax.php', 'relative' ) . '";';

?>

( function() {
     var init, edId, qtId, firstInit, wrapper;

     if ( typeof tinymce !== 'undefined' ) {
          for ( edId in tinyMCEPreInit.mceInit ) {
               if ( firstInit ) {
                    init = tinyMCEPreInit.mceInit[edId] = tinymce.extend( {}, firstInit, tinyMCEPreInit.mceInit[edId] );
               } else {
                    init = firstInit = tinyMCEPreInit.mceInit[edId];
               }
               init["paste_data_images"] = true;

              wrapper = tinymce.DOM.select( '#wp-' + edId + '-wrap' )[0];

.....

Danach kann man wieder Bilder aus der Zwischenablage einfügen.

Krautreporter: Jetzt auch mit PayPal bezahlbar

XPages & Angular.js: Accessing Rich Text (1)

$
0
0

If you want to access Rich Text with Angular.js, an easy way to get the content is to use a XPage as handler and grab the content of a XspInputRichText component. The component does all required steps automatically (f.e. it detaches all embedded images to disc and cleans up the temporary files later) and returns the complete HTML of the Rich Text item.

For the conversion I have created a small java helper class:

package ch.hasselba.xpages.util;

import javax.faces.context.FacesContext;
import javax.faces.el.ValueBinding;

import com.ibm.xsp.component.xp.XspInputRichText;
import com.ibm.xsp.http.IMimeMultipart;

/**
 * Utility class for accessing RichText items
 * 
 * @author Sven Hasselbach
 * @version 1.3
 */
public class RTItemUtil {

    /**
     * 
     * @param dsName
     *            the name of the datasource to use
     * @param rtFieldName
     *            the name of the richtext item
     * @return String with the HTML
     */
    public static String getHTML(final String dsName, final String rtFieldName) {

        // get current FacesContext
        FacesContext fc = FacesContext.getCurrentInstance();

        // create a value binding for the datasource
        String expr = "#{" + dsName + "." + rtFieldName + "}";
        ValueBinding vb = fc.getApplication().createValueBinding(expr);

        // create a rich text components
        XspInputRichText uiCmp = new XspInputRichText();
        uiCmp.setValueBinding("value", vb);
        Object value = uiCmp.getValue();

        // get the value of the component as HTML
        String strHtml = null;
        if (value != null) {
            if (value instanceof IMimeMultipart) {
                IMimeMultipart mime = (IMimeMultipart) value;
                strHtml = mime.getHTML();
            } else {
                strHtml = value.toString();
            }
        }

        return strHtml;
    }

What does the method getHTML do? First, the datasource is accessed by creating a new value binding. Then a new XspInputRichText component is created on the fly which does the magic: All attachments are detachted into the temporary xsppers folder, and linked into the generated HTML code of the Rich Text item.

This is the XPage with the name “getrtdata” which is our handle:

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" rendered="false">

    <xp:this.data>
        <xp:dominoDocument var="documentRTItem" />
    </xp:this.data>
    
    <xp:this.afterRenderResponse>
        <![CDATA[#{javascript:
            importPackage( ch.hasselba.xpages.util );
        
            var res = facesContext.getExternalContext().getResponse();
            res.setContentType("text/html");
            res.setCharacterEncoding( "UTF-8" );
            var writer = res.getWriter();
            
            var rtUtil = new ch.hasselba.xpages.util.RTItemUtil();
            var strHtml = rtUtil.getHTML( "documentRTItem", "Body" );
            
            writer.write( strHtml );
            writer.flush();
            facesContext.responseComplete();
       }]]>
       </xp:this.afterRenderResponse>
       
</xp:view>

The datasource on the this XPage is accessed by URL parameters from our Angular.js application. The method getHTML from the utility class is called with the name of the datasource and the name of the rich text item we want to access.

Now let’s have a look at our Angular.js application. To make it a litlle bit more complicated, the data from the Rich Text item will be loaded into a CKEditor:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8">
        <script type='text/javascript' src="jquery-1.8.3.js"></script>
        <script type='text/javascript' src="http://ckeditor.com/apps/ckeditor/4.4.1/ckeditor.js"></script>  
    </head>
    
    <body data-ng-app="myApp" data-ng-controller="CKEditiorCtrl">
    
        <textarea data-ck-editor data-ng-model="ckEditor.value"></textarea>
        <br>
       
        <button ng-click="loadData( '49573FE44017DA9FC1257CEC0035CBCC' )">load data</button>
    
        <script type='text/javascript' src="angular.js"></script>
        <script type='text/javascript' src="app.js"></script>
    </body>
    
</html>

The resources of the previous article are used in this example. The lastest version of CKEditor is used, and the whole application logic is contained in the file app.js.

When opening the application in the browser, a fresh and empty CKEditor instance will be instantiated:

When clicking the button “load data“, the XPage is loaded in the background. In the Firebug console the response of the request contains the HTML markup, including the pathes to the detached attachments:

Then the CKEditor is updated with the HTML code, and displays the content of the Rich Text item:

How does the app.js looks like?

var myApp = angular.module('myApp',[]);

/**
 * the data service to load the RTItem data
 */
myApp.service('dataService', function($http) {
    delete $http.defaults.headers.common['X-Requested-With'];
    this.getData = function( id ) {
        return $http({
            method: 'GET',
            url: 'getrtdata.xsp',
            params: {
                documentId: id,
                action: 'openDocument'}
            });
    }
});

/**
 * the directive
 */
myApp.directive('ckEditor', [function () {
    return {
        require: '?ngModel',
        link: function ($scope, elm, attr, ngModel) {
            var ck = CKEDITOR.replace(elm[0]);
            ngModel.$render = function () {
                ck.setData(ngModel.$modelValue);
            };
        }
    };
}])

/**
 * the controller
 */
myApp.controller('CKEditiorCtrl', function($scope, dataService) {
    $scope.dataservice = dataService;
    $scope.ckEditor = { value: null };
    $scope.loadData = function( unid ){
        $scope.dataservice.getData( unid ).then(
            function(dataResponse) {
                   $scope.ckEditor.value = dataResponse.data;
            });
    }
    
});

The service dataService is the interface to the XPages backend: The method getData makes the HTTP request with the $http service of Angular.js. The two parameters are the document UNID and the action to perform, and are used to control the datasource of the XPage.

This service is bound to the controller, and is called by the loadData method as soon as the button is clicked. It sets the value of the ckEditor binding with the resulting data from the request. (Btw. if you have a look at the HTML of the button you will see that the used document UNID is hardcoded in this example).

But what is the directive for?

 <textarea data-ck-editor data-ng-model="ckEditor.value"></textarea>

The directive is a “link” between Angular.js and the code of the CKEditor: The data-ck-editor attribute of the textarea is the key to our directive and is searched by Angular.js when the application is initialized. When a matching directive is found, the method link is called, with the parent DOM element as parameter. This DOM element is now replaced by a CKEditor instance. The data-ng-model attribute binds the data of the CKEditor to the defined value of our controller, the $scope.ckEditor.value. This allows to update the content of the CKEditor instance.

That’s it!

XPages & Angular.js: AngScope for Firebug

$
0
0

AngScope is a

“Simple Firebug extension that allows you to inspect the AngularJS scope that a DOM element binds to.”

Just do a right click on the DOM element you want to inspect and select “Inspect Angular Scope“:

This gives you a direct access to all elements of the scopes of your Angular.js application:

You can find the extension here.

Happy Birthday, BILDBlog!


Tschüß RFC 2616! War nett mit Dir!

$
0
0

Wie auf Heise berichtet, ist das RFC 2616 zu seinem 15ten Geburtstag in Rente geschickt worden, und sollte keine Verwendung mehr finden. Bei Fragen rund um die HTTP/1.1 Spezifikation gelten von nun an folgende RFCs:

In jedem der RFCs findet sich ein Abschnitt “Changes from RFC 2616“, indem die grundlegensten Änderungen gegenüber der ursprünglichen Spezifikation erläutert werden.

iOS 8 & die MAC Verschleierung: Einfach genial!

$
0
0

Man muss es Apple lassen: Gute Ideen gehen Ihnen einfach nie aus. Mit iOS 8 wird ein neuen Feature zur MAC Adressen-Verschleierung eingeführt, wodurch Location Based Tracking praktisch unmöglich gemacht wird. Und gleichzeitig wurde mit iBeacon eine Technologie ins Leben gerufen, die eben genau das ermöglicht: Location Based Tracking, nur noch viel genauer, und mit einem deutlich erhöhten Funktionsumfang.

So wird der Markt zukünftig von “Fremdanbietern” bereinigt, da deren bisherige Technik des “MAC-Adressen-Scannens” keine iOS Geräte mehr ordentlich tracken kann. Gleichzeitig feiern Teile der Apple-Gefolgschaft die geplante Einführung, denn Apple sorgt sich ja um die Privatsphäre seiner Nutzer. Und Apple öffnet sich neue Märkte, denn ohne die Nutzung ihrer hauseigenen Technologie verlieren die bespitzelnden Geschäfte einen Teil der Kundschaft, denen man irgendeinen Mist andrehen gut gemeinte Angebote unterbreiten möchte.

Win-Win-Win für Apple also. Und alle sind glücklich.

Ab 13. Juni: Die neue EU-Verbraucherrechterichtlinie

$
0
0

Onlineshopper und Shopbetreiber aufgepasst! Ab 13. Juni tritt die EU-Verbraucherrechterichtlinie in Kraft, und dadurch kann sich einiges ändern:

Die wichtigste Änderung für die Kunden dürfte wohl der Wegfall der 40€-Grenze für die Übernahme der Rücksendekosten durch den Verkäufer sein. Grundsätzlich trägt also der Käufer von nun an die Rücksendekosten.

Für Shopbetreiber gilt es, die neue Widerufsbelehrung mit all Ihren Ausprägungen fristgerecht in den AGBs eingepflegt zu haben, da mit einer Abmahnungswelle zu rechnen ist (Hinweis in eigener Sache: Donnerstag Abend ab 22.00 Uhr ist mein Büro geschlossen).

Swift vs. Objective-C: Benchmarks

$
0
0

Here are some benchmarks comparing Swift and Objective-C: http://www.splasmata.com/?p=2798. These are just simple operations, no complex algorithms. But this unsettles me a little bit. Maybe I should wait a while before I begin to learn Swift.

Die NSA: Too big to comply

$
0
0

Die Banken kamen mit dem “Too big to fail” durch, jetzt versucht es die NSA mit “Too big to comply“. Am Freitag erklärte die NSA dem Gericht:

[A]ttempts to fully comply with the Court’s June 5 Order would be a massive and uncertain endeavor because the NSA may have to shut down all databases and systems that contain Section 702 information in an effort to comply.

Tja, dann kann man da wohl nichts machen…

[Quelle: https://www.aclu.org/blog/national-security/too-big-comply-nsa-says-its-too-large-complex-comply-court-order]

Die Spannung steigt!

$
0
0

Nach langer Pause geht es endlich wieder los! Pünktlich zur WM werden wieder Gesetzesvorschläge eingebracht, die – während der deutsche Michel abgelenkt das Deutschlandfähnchen schwingt – in einer Geschwindigkeit verabschiedet werden, das einem beim Zuschauen schwindelig werden kann. Es ist schon erstaunlich, zu welchen Höchstleistungen die Regierungsparteien im Stande sind, wenn es keiner mitbekommen soll.

Doch die Messlatte für neue Rekorde ist dieses Jahr recht hoch: Das Aushebeln des Informationsfreiheitsgesetzes wie im Fall der Bundesrechnungshofakten hat die aktuelle Bestmarke auf 14 Sekunden gesetzt. Das zu unterbieten, insbesondere wenn es um das Thema Fracking geht, wird schwierig.

Aber mal schauen, was da noch alles kommt: So hätte der  NSA-Untersuchungsausschuss ja noch vor der WM Akten vom Bundesinneministerium erhalten sollen. Doch der Versand wurde auf einem Termin während der WM verschoben.

Krautreporter: Finanzierungsziel erreicht!

$
0
0

Die Krautreporter haben es geschafft! Heute morgen fehlten noch über 1.500 Unterstützer, und ich hatte schon alle Hoffnung aufgegeben. Doch mittlerweile ist die 15.000er Marke geknackt. Und das acht Stunden vor Ablauf, an einem Freitag den 13ten.

Ich hatte schon Angst, dass der Journalismus nun endgültig am Boden liegt, denn nachdem neben dem WM-Start das gestrige Thema des Tages Claus Klebers Twittererfolg war, ahnte ich nichts Gutes.

Doch nun ist es, allen Unkenrufen zum Trotz, doch noch zu einem Happy End gekommen.

Ich bin gespannt, wie die Geschichte weiter geht…


Thema verfehlt. Setzen, Sechs!

$
0
0

Der Philosoph Jörg Friedrich hat auf Heise “Stellung genommen” zu dem erfolgreichen Crowd-Funding der Krautreporter, doch leider hat er in seinem Kommentar irgendwie das Thema verfehlt: Keineswegs geht es um die Zeitung im Allgemeinen, und hätte er die Seite der Krautreporter etwas näher studiert, dann wäre ihm das wohl aufgefallen.

Bevor er sich in seiner Abhandlung über die “Zeitung der Zukunft” vollkommen verliert, bemängelt er die fehlende Innovation des Projektes, denn Online-Journalismus sei ein alter Hut, und jeder Journalismus sei bereits in irgendeiner Form online vertreten.

Abgesehen von der Tatsache, dass mir persönlich kein vergleichbares Online-Magazin in dieser Form bekannt ist (Werbefrei, ohne Abomodell / Paywall, finanziert von vielen unabhängigen Geldgebern, zugänglich für Jedermann), scheint Herr Friedrich den wesentlichen Teil einfach nicht verstanden zu haben: Dass es eben genau um die bestehende Form des Online-Journalismus geht.

Und das dies ein winzig kleiner Versuch ist, ein qualitativ anspruchsvolles Magazin zu produzieren. Ohne nervtötende Klickstrecken, ohne “Aufmerksamkeitsoptimierte” Schlagzeilen, und ohne Native Advertising.

Zum Fremdschämen

$
0
0

In Wiesbaden kennt man Oliver D. und seine “Werke”, denn seit Jahren werden sämtliche freie Flächen wie Plakatwände, Liftfaßsäulen, Sicherungskästen und wo-halt-grade-Platz-ist von ihm mit Bibelsprüchen vollgeschmiert. Meist in schwarz, doch er hat auch immer passende Stifte in anderen Farben dabei. Auch für strukturierte Untergründe.

Unter seinen Zitaten finden sich zahlreiche alttestamentarische Sprüche, gerne frauenfeindlich oder antisemitisch, was die Kirche gar nicht lustig findet (also nicht, dass das in dem dicken Buch drin steht, sondern das daraus zitiert wird). Und immer wieder kritzelt er die Adresse dazu, unter dem “Jesus Christus”, also er, zu finden sei. Der jährliche Schaden, der durch sein Treiben entsteht, solle sich auf mindestens  250.000 € pro Jahr belaufen, gab die Firma Wall AG im Jahr 2012 bekannt, die sich um die Reinigung der von ihr vermieteten Plakatflächen im Stadtgebiet kümmert.

Gegen sein Treiben lässt sich leider nichts unternehmen, denn Oliver D. gilt als unzurechnungsfähig. Er ist an einer Schizophrenie erkrankt und daher Schuldunfähig. Zu holen gibt es bei ihm auch nichts, denn er lebt von Sozialhilfe. Und so bleibt das Ärgernis den Wiesbadenern solange erhalten, bis sich die Gesetzeslage grundlegend ändert, oder Oliver D. sich in irgendeiner Art und Weise anderweitig etwas zu schulden kommen lässt.

Eine Agentur in Wiesbaden versucht es derweil mit einem geschmacklosen PR-Stunt und hat einen passenden Schriftsatz mit dem Namen “Profet” entwickelt. Was sie damit erreichen will, erschließt sich mir nicht: Will man sich über einen geistig kranken Menschen lustig machen? Oder die Betroffenen seiner Sachbeschädigungen verhöhnen? Was auch immer dahinter steckt: Es ist zum Fremdschämen.

Nachtrag:

Gerade gesehen, dass der Font von 2011 ist. Also eine Jugendsünde, die man wohl besser unter den Teppich kehrt. Oder eben auf seiner Newsseite lässt. Was es eigentlich noch schlimmer macht…

Verbrannte Erde

$
0
0

Zwar hatte die NATO in dem von Ihrem Generalsekretär Anders Fogh Rasmussen selbst ausgearbeiten neuen Strategischem Konzept im Jahr 2010 beschlossen, die Zusammenarbeit mit Russland zu verbessern, doch mittlerweile scheint das etwas in Vergessenheit geraten zu sein.

Denn die NATO warnt: Der Kreml verbreite nicht nur mit bezahlten Schreiberlingen Pro-Russische Propaganda in den sozialen Netzwerken, er unterwandere sogar die Fracking-Gegner, um die Abhängigkeit der EU von russischem Gas zu erhalten.

Wie praktisch, dass bis zur Sommerpause noch eine Gesetzesvorlage für die Zulassung von Fracking in Deutschland eingereicht werden soll. Denn aus strategischen Gründen ist die Idee gar nicht so schlecht, auch in Deutschland ordentlich Dreck ins Grundwasser zu pumpen: Wenn der Russe nämlich mit dem Panzer über den Rhein rollt, hat er nur verseuchtes Territorium erobert.

Klinsmann

$
0
0

Wann immer ich Klinsmann im Fernsehen sehe, was aus gegebenem Anlass zur Zeit häufiger vorkommt, muss ich zwangsläufig an seinen Auftritt damals bei Günther Jauch denken, im Debüt der neuen ARD Talkshow am 11. September 2011. Denn dort erklärte er uns “den Amerikaner” und wie der so tickt:

Das der zwar immer nach vorne schaue, und nicht nach hinten, doch in ständiger Angst lebe, seinen Job zu verlieren. Und keine Zeit hätte, sich mit Politik und Nachrichten tiefer zu beschäftigen.

“Der Amerikaner ist ein Doppelverdiener, dessen Kinder in die Schule gehen und der am Wochenende sein Haus repariert. Wenn der Abends nach Hause kommt, dann schaut er einen von 300 Fernsehsendern in der Küche und ist deshalb schlecht informiert“

Was die Möglichkeit einer kritischen Auseinandersetzung mit dem Geschehen in der Welt deutlich einschränke. Ganz dem Klischee entsprechend:

“Viele Amerikaner können diese Zusammenhänge auch gar nicht nachempfinden – Irak, Afghanistan, die Lager, all diese Themen”

Beruhigend, dass die USA auf 7.700 Atomsprengköpfen sitz.

Und dann geht mir die Szene nicht mehr aus dem Kopf, wie Klinsmann dass den unschuldigen Zivilisten erklärt, die einen fehlgeschlagenen Drohnenangriff mit schwersten Verbrennungen überlebt haben (bei dem Angriff kamen drei Kinder und eine Schwangere ums Leben). Oder den Unschuldigen, die in Guantanamo seit Jahren einsitzen oder eingesessen haben

Yii Framework: Security Fix for Version 1.1.14

Viewing all 169 articles
Browse latest View live


Latest Images