Joomla! mod_delicious stopped working
Fatal error: Call to a member function get_items() on a non-object in /home/xxx/public_html/modules/mod_delicious/helper.php on line 25
All of a sudden "mod_delicious" stopped working today. I wonder if it has something to do with:
http://techcrunch.com/2011/04/27/yahoo-sells-delicious-to-youtube-founders/
Toshiba 55WL768G – keine YouTube App?
Kürzlich habe ich den Fernseher Toshiba 55WL768G erworben und war gespannt auf die von Zeitschriften gelobte YouTube Funktion. Nach dem Anschluss des TV's ans Internet war ich sehr überrascht, dass ich die Funktion nirgends auswählen konnte. Auch ein Blick ins mitgelieferte Handbuch brachte keine Klarheit. Erst der Download des deutschen Handbuchs offenbarte die gesuchte Funktion auf Seite 55. Dies brachte mich auf die Idee, den Menüpunkt "Land" in den Einstellungen von Schweiz auf Deutschland zu ändern und siehe da, die gesuchte YouTube App ist nun unter dem Menüpunkt "Anwendungen" verfügbar. Die Ländereinstellung hat bei DVB-S zusätzlich den positiven Nebeneffekt, dass nun alle für den deutschen Sprachraum relevanten Kanäle beginnend von der 1. Senderposition aufgelistet werden. Dadurch entfällt das mühsame Sortieren der relevanten Sender.
Ich hoffe dieser Beitrag konnte anderen verwirrten Schweizer-Käufern weiterhelfen.
Eclipse 3.7 Indigo with M2E – lifecycle connectors
Recently Eclipse 3.7 Indigo with M2E Plugin 1.0.0 was released. Since Eclipse 3.7, M2E is part of the Eclipse Foundation. I had expected better of it.
Since M2E 1.0.0, the plugin features a new life-cycle connector concept for maven-plugins. M2E users are now forced to provide a connector for every plugin used in their builds or if none connectors are available, to ignore the connectors. Unfortunately, to ignore the missing connectors the user is required to modify his pom files for M2E to work properly.
If a maven-plugin is missing a connector, M2E will show you errors like: Plugin execution not covered by lifecycle configruation: {plugin-GAV-goals} and prompts you to modify your project pom or parent pom as following:
<pluginManagement>
<plugins>
<!--This plugin's configuration is used to store Eclipse m2e settings
only. It has no influence on the Maven build itself. -->
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>
// plugin groupId
</groupId>
<artifactId>
// plugin artifactId
</artifactId>
<versionRange>
[1.0,) // plugin versions
</versionRange>
<goals>
// plugin goals
<goal>create</goal>
</goals>
</pluginExecutionFilter>
<action>
// M2E should ignore the plugin
<ignore></ignore>
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement>
This means that M2E is no longer an interpreter of Maven, it's a modifier. It binds your independent Maven projects to a specific IDE, which is in my opinion the wrong path. I'd prefer a much more "lighter" Maven integration in Eclipse, for example like NetBeans 7.x does. This led to several discussions on the M2E mailing-list. As a result, I created an enhancement-request with collected and own suggestions from the list.
I hope an enhancement will soon be released, I could imagine that this will be a real deal breaker for several users to use M2E-1.0.0+.
Fan control for Lenovo S10-3T
The Lenovo S10-3T is a very smart device but when it comes to noise, it is very annoying like any other non-professional notebook. So I decided to modify a fan control profile written in C# for Notebook Hardware Control (NHC), which was originally programmed for the Lenovo S10 netbook.
It required also some changes to make the file compatible with the newest release of NHC version 2.4.3 (32 Bit only).
click here to download the S10-3T ACPI profile and copy the files to the NHC acpi directory. (tested with s10-3T bios version: 62)
key functions
return ACPI.FIELD.Read("_SB.PCI0.LPCB.EC0.RTMP", ref _TMP._tmp);
This function reads the actual cpu temperature from the field "RTMP" and stores it into the variable _tmp. This is needed to check the actual cpu temp.
ACPI.FIELD.Write("_SB.PCI0.LPCB.EC0.RTMP", TEMPERATURE_FAN_ON.temperature_fan_on
This function does all the magic, it overwrites the current cpu temperature with a fake temperature value (temperature_fan_on). This makes the ACPI-controller believe that the CPU is still running cool so it won't turn the fan on. The field RTMP gets refreshed automatically, so it's essential to rewrite this fake value every 50 ms.
parameter description
In the following, I'm going to give a brief introduction to the available parameters.
CPU FAN ON Threshold
If this value is reached, the fan starts spinning
CPU FAN OFF Threshold:
If this value is reached, the fan starts idling.
Temperature Value for CPU FAN ON:
If the fan gets triggered, it will start spinning with a speed matching this temperature value. The higher this value was set, the faster and louder the fan will spin till it reaches the CPU FAN OFF Threshold value.
Temperature Value for CPU FAN OFF:
If the fan gets deactivated, it will start idling with a speed matching this temperature value. The lower this value was set, the slower and quieter the fan will idle till it reaches the CPU FAN ON Threshold value.
With the settings set as shown, it is possible to surf the web and doing office work without any disturbing fan noise.
Let me know it works for you! Credits to Carsten (the creator of the S10 ACPI profile)
Maven artifact sources / javadoc download
Artifact sources resolution
Um mit Maven alle sourcen der verwendeten direkten und transitiven dependencies aufzulösen, wird folgendender plugin Aufruf verwendet:
Nun muss man wissen, dass nach dem Aufruf im target Verzeichnis des entsprechenden Projektes ein cache-Ordner "dependency-maven-plugin-markers" erstellt wird. Dies verhindert ein erneutes auflösen der sourcen beim selbigen Aufruf.
Mit einem vorangehenden clean kann das dependency Plugin zu einem erneuten lookup gezwungen werden.
Unter welchen Bedingungen der cache des plugins geleert wird ist mir nicht bekannt und aus der Dokumentation leider nicht ersichtlich.
Die oben gezeigten Befehle funktionieren nur, wenn der default classifier "sources" für die source artifacts verwendet wurde wie zum Beispiel hier: "junit-4.8.1-sources.jar".
Einen ähnlichen Effekt kann man erzielen mit:
Hier wird allerdings kein cache im target abgelegt, die sourcen werden direkt ins lokale Repository geladen, ansonsten ist das Resultat dasselbe.
Artifact javadoc resolution
Mit dem folgeden Befehl werden alle javadocs aufgelöst.
Wieder unter der Vorraussetzung, dass der standart classifier -javadoc nicht verändert wurde.
Weiterführende Links
http://maven.apache.org/plugins/maven-dependency-plugin/sources-mojo.html
Maven 3.0 mit Artifactory 2.3.x
Bei der Umstellung von Maven 2.x auf Maven 3.0 stiess ich auf einige Probleme, die ich erst nach langen hin und her zwischen der Maven & Artifactory mailing list lösen konnte.
Das Problem zeigte sich, als Maven 3.0 nach einem update-snapshots mit -U, neuere im lokalen repository installierte Artifakte mit älteren aus dem artifactory überschrieben hat. Dieser Effekt trat mit Artifactory 2.2.3 und non-unique snapshot repositories auf.
Dieser Fehler hat mir für einige Zeit Kopfzerbrechen bereitet, doch schliesslich konnte eine Lösung mit dem Artifactory Support gefunden werden. Artifactory 2.3.x ist zwar mit Maven 3.x kompatibel, aber NUR wenn unique snapshot repositories verwendet werden. Unique bedeutet, dass die snapshots nicht einfach als z.B project-4.0.0-SNAPSHOT.jar im Artifactory abgelegt werden, sondern mit einem angehängten Zeitstempel zur eindeutigen Identifikation. Ein Löschen aller SNAPSHOT's im repository und ein erneutes deployen aller SNAPSHOT-Artifakte brachte die Lösung.
Ein zweiter Blick in Maven 3.0 compatibility Notes schaffte Klarheit:
Non-unique Snapshot Deployments The setting <uniqueVersion>false</uniqueVersion> for a distribution repository has no effect in version 3.x, snapshot artifacts will always be deployed using a timestamped version.Maven deployt SNAPSHOT's seit Version 3.x immer mit angehängten Zeitstempel. Maven versucht anhand des Zeitstempel zu vergleichen welche Artifakte aktueller sind, ist kein Zeitstempel vorhanden, wie dies bei non-unique repositories der Fall ist, so führt dies zum beschriebenen Fehler.
Wie es aussieht haben die Entwickler von Sonatype (Nexus) dies der Konkurrenz von JFrog (Artifactory) "vergessen" zu sagen.
Nun muss man wissen, dass Artifactory für Maven repositories die Einstellungen per default auf non-unique setzt und dies auch ausdrücklich im Artifactory guide empfohlen wurde. In der Zwischenzeit wurde die Passage jedoch angepasst und Artifactory 2.3.2 wird Maven snapshot repositories per default als unique verwalten:
Maven 3 has, unfortunately, dropped support for resolving and deploying non-unique snapshots. Therefore, if you have a snapshot repository that is using non-unique snapshot, it is recommended to change its Maven snapshot policy to 'Unique' and to remove any previously deployed snapshot from this repository.
The unique snapshot name generated by the Maven client on deployment cannot help in identifying the source control changes from which the snapshot was built and has no relation to the time sources were checked out. It is advised to have the artifact itself embed the revision/tag (as part of its name or internally) for clear and visible revision tracking. Artifactory allows you to tag artifacts with the revision number as part of its Build Integration support. http://wiki.jfrog.org/confluence/display/RTF/Local+Repositories
So, ich hoffe ich konnte jemanden hiermit vor Problemen bewahren.
Meine erstellten Mailing-list Einträge zum Problem:
http://forums.jfrog.org/artifactory-amp-maven-3-0-metadata-problem-td5776632.html
http://maven.40175.n5.nabble.com/Maven-3-0-doesn-t-update-snapshot-artifacts-td3276893.html
Sinn & Unsinn von {@inheritDoc}
Ich wurde schon des öfteren nach code-reviews darauf angesprochen, wieso ich bei meinen überschriebenen Methoden nicht immer {@inheritDoc} im javadoc deklariere. Ich halte dieses Vorgehen bei 90% der Fälle als überflüssig und unübersichtlich. Um dies zu erläutern habe ich ein paar javadoc Tests durchgeführt...
Es wurden die Klassen ParentClass und ChildClass erstellt, wobei ChildClass von ParentClass erbt und die Methode "methodToOverride()" überschreibt.
Gezeigt werden code-Schnipsel aus ChildClass und dem entsprechend generierten Javadoc.
Methode überschrieben ohne Javadoc
1 2 3 |
Wird kein Javadoc angegeben, so wird die Beschreibung der überschriebenen Methode automatisch referenziert. Fügt man allerdings einen Kommentar hinzu, wird das Javadoc wie folgt generiert:
Methode überschrieben mit Javadoc
1 2 3 4 5 6 | /** * Javadoc of overriden method */ public void methodToOverride() { System.out.println("do something..."); } |
Nun ist das Javadoc der überschriebenen Methode aus der Klasse ParentClass nicht mehr direkt ersichtlich, sondern wird durch den passenderen Kommentar ersetzt.
Methode überschrieben ohne Javadoc mit {@inheritDoc}
1 2 3 4 5 6 7 | /** * {@inheritDoc } */ public void methodToOverride() { // call overriden method super.methodToOverride(); } |
Wird auf einen Kommentar verzichtet und wird wie leider des öfteren nur {@inheritDoc} angegeben, so hat man ein ähnliches, wenn nicht schlechteres Resultat, wie wenn man kein javadoc schreibt! Der Kommentar wird 1:1 kopiert und die Information welche Methode das ursprüngliche javadoc beinhaltet ist verloren. Damit wird der Quellcode unnötig aufgeblasen und Informationen verschenkt.
Methode überschrieben mit Javadoc und {@inheritDoc}
1 2 3 4 5 6 7 8 9 | /** * {@inheritDoc } * Javadoc of overriden method */ public void methodToOverride() { System.out.println("do something..."); //and call overriden method super.methodToOverride(); } |
Im Javadoc ist ersichtlich, dass der Kommentar aus der Beispiel-Methode (Javadoc of overriden method) am Ende angefügt wurde.
Der eigentliche Sinn von {@inheritDoc} liegt darin den Kommentar der überschriebenen Methode aus der parent Klasse wiederzuverwenden und mit dem der child Klasse zu ergänzen. Das Tag ist somit ein simpler Platzhalter, welcher nur Sinn macht, wenn die Methode wie im gezeigten Beispiel teilweise überschrieben wird. Dies ist allerdings "bad practice" und sollte wenn möglich vermieden werden, da dies den code sehr verstrickt und kompliziert macht. Desweiteren ist durch das Setzen des leeren Tags später im Javadoc nicht mehr klar ersichtlich, zu welcher Methode der Kommentar ursprünglich verfasst wurde. (siehe 1. Beispiel: "Description copied from class: ParentClass")
Methode überschrieben mit Javadoc und @Override
1 2 3 4 5 6 7 | /** * Javadoc of overriden method */ @Override public void methodToOverride() { System.out.println("do something else!"); } |
Ab Java 1.5 sollte @Override verwendet werden um überschriebene Methoden klar zu kennzeichnen.
Methode überschrieben ohne Javadoc und @Override
1 2 3 4 |
Die annotation hat aber keinen Einfluss auf die Generierung des Javadocs wie man in diesem Beispiel sehen kann. Wurde kein Kommentar verfasst, so wird dies signalisiert und derjenige der parent Methode angezeigt wie in Beispiel 1.
Dieses Vorgehen ist zur Kennzeichnungs überschriebener Methoden im Vergleich zu @inheritDoc viel kompakter und man verliert keine Informationen darüber, zu welcher Methode der Kommentar ursprünglich verfasst wurde. Deshalb sollte der Einsatz von @inheritDoc nur beschränkt in Betracht gezogen werden. Desweiteren werden die @Override annotations bei einigen IDE's deutlich hervorgehoben um eine noch bessere Übersicht zu gewähren und um zusätzliche Funktionen bereitzustellen.
Weiterführende Links
Automatic Copying of Method Comments:
http://download.oracle.com/javase/1.5.0/docs/tooldocs/windows/javadoc.html
Lernen & gleichzeitig hungernden helfen?
Als zusätzliche Lernvorbereitung für meine anstehende CAE (Certificate Of Advanced English) Prüfung, wurde mir die äusserst gelungene Lernseite www.freerice.com empfohlen. Die Seite wurde ursprünglich vom Programmierer und Familienvater John Breen ins Leben gerufen. Mit dem Ziel seine Söhne für den College Eintrittstest vorzubereiten. Nachdem er das Potential der Seite realisiert hatte, spendete er sie dem World Food Programme. Innerhalb eines Monats wurde bereits so viel Reis gespendet, um 50'000 Menschen für einen Tag zu ernähren. Diese Zahl ist bis heute auf über 4 Millionen Menschen angestiegen!
Das Prinzip ist sowohl einfach wie auch genial. Für jede richtig beantwortete Frage werden 10 Reiskörner gespendet. Um die Finanzierung der Reiskörner kümmert sich die jeweilige Organisation/Firma des eingeblendeten Werbebanners. Nach jeder richtigen Antwort wechselt der Werbebanner und der entsprechende Werber bezahlt 10 Reiskörner. Seit der Aufschaltung der Seite am 7. Oktober 2007 wurden bereits 81,836,814,660 Reiskörner gespendet! Eine detaillierte Statistik ist hier zu finden. Wobei die Zahlen mit Vorsicht zu geniessen sein sollten, da laut Wikipedia diverse, raffinierte Scripts mit geholfen haben dürften..
Nichtsdestotrotz ist die Idee sehr nobel und beim World Food Programme in guten Händen!
Neben Vokabeln und Grammatik in den Sprachen Englisch, Französisch, Italienisch und Spanisch, können auch Mathematik, Chemie, Geographie und Kunst vertieft werden.
Office Outlook startet nicht…
Eines Tages empfing mich Outlook 2007 auf meinem Rechner (Win7 64 bit) beim Start mit dieser merkwürdigen Fehlermeldung:
Microsoft Office Outlook kann nicht gestartet werden. Das Outlook-Fenster kann nicht geöffnet werden.
Das Problem kann ganz einfach behoben werden indem man ins Verzeichniss
"C:\Users\(Benutzername)\AppData\Roaming\Microsoft\Outlook" wechselt und die 0-byte grosse Datei "outlook.xml" entfernt.
Feature Branches mit Tortoise-SVN 1.6
Über die graphische Benutzeroberfläche von Tortoise lassen sich relativ einfach feature branches erstellen und verwalten.
Die Definition eines feature branch:
"It's a temporary branch created to work on a complex change without interfering with the stability of /trunk. Unlike release branches (which may need to be supported forever), feature branches are born, used for a while, merged back to the trunk, then ultimately deleted. They have a finite span of usefulness." (Quelle: http://svnbook.red-bean.com/en/1.1/svn-book.html)Im Folgenden werde ich auf zwei Möglichkeiten eingehen, um solche branches mit Tortoise zu erstellen, wobei die zweite Variante einen Subversion-Server auf Version 1.5 vorraussetzt.
Verzeichnisstruktur:
Die Struktur des Beispiel-Projektes ist folgendermassen aufgebaut:
antlr-demo
+ branches
+ tags
+ trunk
+ src
Wichtiger Hinweis
Vor dem branchen sollten keine lokalen Änderungen in der working copy vorliegen. Dadurch kann bei einem Merge-Fehler mit Hilfe des Befehls "revert" jederzeit ein gültiger Stand wiederhergestellt werden.
Tortoise 1.6 mit Subversion Server < 1.5
branching / tagging
Im Explorer mit Rechtsklick auf das Verzeichniss trunk und den Befehl "Branch/Tag..." auswählen.
Dies erstellt einen branch mit der HEAD revision vom trunk Inhalt in das Verzeichniss ".../branches/antlr-demo-1.0.1".
Solche Kopien sind nicht "teuer", da SVN die Dateien nicht einfach im Repository dupliziert, sondern lediglich ein link auf den neu erstellten Ordner setzt. Werden nun Dateien geändert und in den branch commited, so werden nur diese Dateien neu erstellt. Dies hat eine deutliche Speicherentlastung des Repositories zur Folge.
Nach der Fertigstellung eines features sollen die Änderungen zurück in den trunk einfliessen.
merging ohne merge-tracking
Rechte Maustaste auf trunk und Befehl "Merge..." wählen. Als "Merge type" wählt man "Merge a range of revisions".
Nun ist wichtig, dass man das Feld "Revision rang to merge" nicht einfach leer lässt, sondern im Dialog "Show log" implizit angibt welche revisions in den trunk gemerget werden sollen.
Am besten setzt man den Filter "Stop on copy/rename". Hiermit werden nur die relevanten Änderungen in diesem branch angezeigt. Danach kann man das merging starten. SVN bietet zudem noch die Möglichkeit vorher einen test-branch durchzuführen.
Diese Methodik hat den Vorteil, dass genau konfiguriert werden kann, welche Änderungen in den trunk einfliessen sollen. Als Nachteil ist sicherlich die manuelle Interaktion beim Auswählen der revisions und somit die höhere Fehleranfälligkeit zu erwähnen.
Tortoise 1.6 mit Subversion Server >= 1.5
merging mit merge-tracking
Mit Subversion Version 1.5 wurde das feature "merge-tracking" eingeführt. Durch implizites Setzen des "mergeinfo" property kann SVN selbst feststellen, welche revisions für den merge benötigt werden. Im folgenden Beispiel gehen ich davon aus, dass der branch wie in der oben beschriebenen Möglichkeit erstellt wurde.
Rechte Maustaste auf das Verzeichniss trunk und den Befehl "Merge..." auswählen. Als "Merge type" wählt man "Reintegrate a branch".
Nun kann man den zu integrierenden branch angeben und mergen. Mit dieser Methode ist es nicht erforderlich die revisions manuell zu setzen. SVN merkt sich durch das property "mergeinfo" welche revision bereits integriert wurden und führt diese nach jedem branch entsprechend nach.
Diese Variante ist weniger Fehleranfällig wie letztere, allerdings auch weniger flexibel, da immer die gesamten Änderungen im brach integriert werden.
happy merging!









