Erich Holzbauer

If you would create something, you must be something. Johann Wolfgang von Goethe (1749-1832)

Category: Dev (Page 1 of 3)

WordPress: Blog unter gleichen Domains

WordPress greift für seine URL-Generierung auf 2 Konstanten zurück die über die Optionen eingestellt werden können. Man kann aber auch die URL zur Laufzeit in der wp_config.php ändern. Warum will man das? – Der Usecase bei mir ist, dass 2 Domains auf das selbe Blog zeigen, aber es keine Weiterleitung geben soll. Sprich ich will 2 Seiten mit eigenen URLs und identischen Content.

Umsetzung: Man untersucht den Host der Anfrage und setzt je nach dem die 2 Konstanten neu. Ist die Bedingung nicht erfüllt macht man gar nichts und es greifen die Einstellungen aus den Optionen.

if ($_SERVER['HTTP_HOST'] == "mobilepulse.de") {
define('WP_HOME','http://mobilepulse.de');
define('WP_SITEURL','http://mobilepulse.de');
} else if ($_SERVER['HTTP_HOST'] == "mobilepulse.at") {
define('WP_HOME','http://mobilepulse.at');
define('WP_SITEURL','http://mobilepulse.at');
}

Surft man jetzt die Seite an bleibt die generierte URL gleich der ursprünglich angefragten Domain und wechselt nicht auf die Hauptdomain (mobilepulse.at -> mobilepulse.at).

Wordpres 2.7 Pingback Probleme

WordPress 2.7 hat durch einen schweren Softwarefehler Probleme andere Blogs anzupingen. Aus irgendeinem Grund wurde der Timeout für einen Pingback auf 0.01 Sekunden anstelle 1 abgesenkt. Das führte praktisch dazu, dass keine Trackbacks und Pingbacks mehr funktionierten. Es gibt aber eine einfache Lösung für das Problem:

wp-includes/cron.php Zeile 200:
wp_remote_post($cron_url, array('timeout' => 0.01, 'blocking' => false));

ändern zu:

wp_remote_post($cron_url, array('timeout' => 1, 'blocking' => false));

Im Bugfix Release 2.71 wird der Fehler dann auch gefixt sein.

phpbb3 mysql4 zu mysql5 Update

In den letzten Tagen habe ich mir Zeit genommen einige meiner Domains/Webseiten auf einen neuen Ubuntu Server zu transferieren. Sie waren auf einem opensuse. Dank der tollen Migrations-Funktion von Plesk kann man 1:1 seine gesamte Konfig von einem Server zum anderen übertragen. Probleme gabs damit soweit nicht. Beim check der Webseiten kam aber bei einer phpbb3 Installation böses Erwachen: Durch den Umstieg von mysql4 auf mysql5 gabs hier einige Probleme. Dazu einige Hilfestellungen aus den Support Foren:

Default Values Queries
Spaltenlänge bbcode_uid

Man beachte: beide Datenbanken SIND utf8!!. Zum einen hat der DB Layer von phpbb3 Probleme mit Querys, da MySQL5 keine Default Values mehr hat und alle Querys alá „insert into xx value (“, 2, „uuu“)“ aussahen. Dafür gibts aber ein offizielles Script. Drüber laufen lassen -> Beiträge können erstellt werden. Oder doch nicht..? Fehlermeldung „Data too long for column ‚bbcode_uid‘ at row 1“ -> Lösung: Einfach die Spaltenlänge von bbcode_uid auf 8 erhöhen. Dann noch die Probleme mit der fehlerhaften Encodierung (komischerweise ist nur die Tabelle phpbb_posts betroffen) mit folgenden SQl Script fixen:

UPDATE phpbb_posts SET post_text = REPLACE(post_text, 'ß', 'ß') WHERE post_text LIKE '%ß%';
UPDATE phpbb_posts SET post_text = REPLACE(post_text, '´', '') WHERE post_text LIKE '%´%';
UPDATE phpbb_posts SET post_text = REPLACE(post_text, 'ä', 'ä') WHERE post_text LIKE '%ä%';
UPDATE phpbb_posts SET post_text = REPLACE(post_text, 'ö', 'ö') WHERE post_text LIKE '%ö%';
UPDATE phpbb_posts SET post_text = REPLACE(post_text, 'ü', 'ü') WHERE post_text LIKE '%ü%';
UPDATE phpbb_posts SET post_text = REPLACE(post_text, 'Ä', 'Ä') WHERE post_text LIKE '%Ä%';
UPDATE phpbb_posts SET post_subject = REPLACE(post_subject, 'ß', 'ß') WHERE post_subject LIKE '%ß%';
UPDATE phpbb_posts SET post_subject = REPLACE(post_subject, '´', '') WHERE post_subject LIKE '%´%';
UPDATE phpbb_posts SET post_subject = REPLACE(post_subject, 'ä', 'ä') WHERE post_subject LIKE '%ä%';
UPDATE phpbb_posts SET post_subject = REPLACE(post_subject, 'ö', 'ö') WHERE post_subject LIKE '%ö%';
UPDATE phpbb_posts SET post_subject = REPLACE(post_subject, 'ü', 'ü') WHERE post_subject LIKE '%ü%';
UPDATE phpbb_posts SET post_subject = REPLACE(post_subject, 'Ä', 'Ä') WHERE post_subject LIKE '%Ä%';
UPDATE phpbb_users SET user_sig = REPLACE(user_sig, 'ß', 'ß') WHERE user_sig LIKE '%ß%';
UPDATE phpbb_users SET user_sig = REPLACE(user_sig, '´', '') WHERE user_sig LIKE '%´%';
UPDATE phpbb_users SET user_sig = REPLACE(user_sig, 'ä', 'ä') WHERE user_sig LIKE '%ä%';
UPDATE phpbb_users SET user_sig = REPLACE(user_sig, 'ö', 'ö') WHERE user_sig LIKE '%ö%';
UPDATE phpbb_users SET user_sig = REPLACE(user_sig, 'ü', 'ü') WHERE user_sig LIKE '%ü%';
UPDATE phpbb_users SET user_sig = REPLACE(user_sig, 'Ä', 'Ä') WHERE user_sig LIKE '%Ä%';
UPDATE phpbb_topics SET topic_title = REPLACE(topic_title, 'ß', 'ß') WHERE topic_title LIKE '%ß%';
UPDATE phpbb_topics SET topic_title = REPLACE(topic_title, '´', '') WHERE topic_title LIKE '%´%';
UPDATE phpbb_topics SET topic_title = REPLACE(topic_title, 'ä', 'ä') WHERE topic_title LIKE '%ä%';
UPDATE phpbb_topics SET topic_title = REPLACE(topic_title, 'ö', 'ö') WHERE topic_title LIKE '%ö%';
UPDATE phpbb_topics SET topic_title = REPLACE(topic_title, 'ü', 'ü') WHERE topic_title LIKE '%ü%';
UPDATE phpbb_topics SET topic_title = REPLACE(topic_title, 'Ä', 'Ä') WHERE topic_title LIKE '%Ä%';

also noch mal im Detail die Reihenfolge (angenommen man hat einen kompletten Dump in der neuen DB eingespielt und realisiert dass einiges nicht funktioniert):

  1. mysql4 -> mysql5 Upgrade Script Ausführen und SQL am Server exekutieren
  2. Die Länge der Spalte „bbcode_uid“ in der Tabelle phpbb_posts auf 8 erhöhen
  3. komplette Spalte phpbb_posts trunkieren
  4. Dump nur für diese Tabelle wieder einspielen
  5. Encoder Fix SQL ausführen
  6. Fertig

Wechsel zu Netbeans 6.5

Brandneu ist das Final Release der neuen major Netbeans Version. Netbeans 6.5 bringt viele Neuerungen – vor allem für nicht Java Entwickler, welche die IDE auch für andere Sprachen nutzen wollen. Ich bin ja ein Anwender, der neben Java, Java Mobile Projekten vorrangig Dinge in php – neuerdings auch groovy – codet. Für meinen Anwendungsbereich bietet mir als das neue Netbeans alles was ich brauche in einer IDE. Hat den riesigen Vorteil, dass ich mich nicht permanent, wenn ich beispielsweise ein php Projekt mache neue Hotkeys merken muss und ständig falsche Funktionen in den unterschiedlichen IDEs suche.

War bis dato so, dass ich für meine php Dinge das Zend Studio für Eclipse verwendet hab. Das war auch ganz nett. Was mir aber Netbeans 6.5 in Bezug auf php bieten kann hat mich überzeugt. Einzig das profilling mach ich noch im Zend Studio. Die Grails Unterstützung ist die beste, die man momentan für eine IDE bekommen kann.

Also war der Wechsel beschlossene Sache. Verlief eigentlich alles reibungslos. Alle alten Projekte wurden perfekt übernommen. Das alte Problem bestand noch immer, dass meine Web Projekte die Server Zuordnung verloren haben (Wechsel von Glassfish 2 -> 3). War aber kein Problem das im Nachhinein zu konfigurieren. Nun hab ich endlich eine IDE für fast alles – danke Netbeans.

Google Ajax Lib API

Google hat ja gestern ihre AJAX Libary API vorgestellt. Im Prinzip ist diese API ja nichts anderes als ein Ersatz für die Speicherung der Libs am eigenen Server. Die API bietet dabei die bekanntesten Vertreter an:

  • jQuery
  • prototype
  • script.aculo.us
  • MooTools
  • dojo

Sie erlaubt den Zugriff auf die jeweiligen JS File einerseits über ein URL:

<script src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.2/prototype.js"></script>

als auch über den Google AJAX Loader:
google.load("jquery", "1");

Den Vorteil den die AJAX Lib API mit sich bringt ist mit der oben angeführten Syntax, dass automatisch immer die letzte Version der Libary eingebunden wird. Ein manuelles Updaten der Files am eigenen Server entfällt dadurch völlig. Natürlich ist auch das einbinden einer bestimmten Version und ein komprimiertes File möglich:

google.load("jquery", "1.2", {uncompressed:true});

Für mehr Infos zur Funktionsweise der sehr simplen API gibts eine kleine Doku.

JS Port of Processing

John Resig is really the man. He just ported the processing language into a javascript api. For drawing the forms he is using the canvas object, so unfortunately the api won’t work in older browsers who don’t support it. Nevertheless awesome work.

Awsome JS Editor in Netbeans


Yeah, netbeans rocks that’s for sure. Look at this sophisticating autocoplete feature hitting netbeans in its new 6.1 release. Also have a look at the screencast of Roman Strobl explaining the key features of the new javascript editor.

JavaDeus08

Irgendwer der auch hingeht?

Simple JSON-RPC Class

JSON-RPC is a simple methode to transfer data without site refreshing from the server to the client. It’s an alternative to AJAX calls and used in many web applications, for example most of the google apps use it for their client-server communication. Here’s my simple implementation:

The Class

jsonRPC = function() {
   cbstore = new Object();
   var counter = 0;
   var base = "insert your base url here";
   var encode = encodeURIComponent;

   var cleanup = function(id, s) {
      delete this.cbstore[id];
      setTimeout(function() {
         document.body.removeChild(s);
      }, 0);
   }
   this.send = function(params, callback) {
      var id = "cb" + ++counter;
      var timeout = setTimeout(function() {
         cleanup(id, s);
         callback(null);
      }, 2000);
      cbstore[id] = function(data) {
         //cancelTimeout(timeout);
         cleanup(id, s);
         callback(data);
      };
      var s = document.createElement("script");
      document.body.appendChild(s);
      s.src = base + "?callback=cbstore." + id +
      "&" + (params);
   }
   this.call = function(params, callback) {
      this.send(params, function(data) {
         if (!data || data.Status.code != "200") {
            callback(null);
         } else {
            var c = data.pois;
            callback(c);
         }
      });
   }
}

The Serverside

To trigger the clientside callback function you must insert it in your server-side response. The response must look like this:

print (insert the callback function process from GET here + "({Status: { code: 200, request: "getpois" }, pois: [");


//output of your data in JSON format

print("]})");

Usage

mycall = new jsonRPC();
mycall.call("insert some params here", function(json) {
	if (!json || json == undefined || json == null)
		return;

       //do something with the response data here



});

What’s next

To be honest, this is a very ugly implmentation and I have to work over it quite soon. It’s now not possible to use the class for different requests. So I will add a constructor in a next version, allowing to pass a the base url when instancing the object. Also the response data object (pois) is not changeable via constructor variable -> need to be changed. (FYI: I used this class to load objects onto a visual map, therefore the name pointofinterst.) For now you can play with that code a litte bit an evaluate how it works for you as an AJAX alternative.

Android Tutorial

Kürzlich hatte ich das Vergnügen mich 1 Tag mit Google Android beschäftigen zu können. Dazu passend gibt es ein kleines Howto um auch anderen da draußen den Einstieg zu erleichtern. Voraussetzung für das Tutorial sind eine fertig installierte Eclipse IDE und Java Kenntnisse. Eine kleine Einführung was Android eigentlich kann und ist hab ich hier geschrieben.

Read More

Page 1 of 3

Powered by WordPress & Theme by Anders Norén