Lange Zeit habe ich mich dagegen gesträubt, die Besucher meiner Website durchzuanalysieren und schon gar nicht wollte ich deren Daten an eine der globalen Datensammelstellen weitergeben.
Doch es gibt ja inzwischen gute Alternativen zu den allbekannten zentralen Webanalyse-Tools, die zum Beispiel auf http://www.gutestun.org/google/17-google-analytics-alternativen-7/ gut zusammengefasst werden.
Letztendlich überzeugt hat mich dann Piwik: In tatsächlich nur 5 Minuten installiert bietet es in übersichtlicher Form alle Analysemöglichkeiten, die ich mir (als zugegebener Nicht-Profi im Marketing) wünschen kann. Das Ganze als Open Source und ohne dass die Daten meiner Besucher den Server verlassen müssen.
Dafür Daumen hoch!
Technischer Fortschritt
Neues aus der Entwicklung des Internet
Dienstag, 13. März 2012
Dienstag, 6. März 2012
Über Kamera-ISO-Werte bei Samsung Android Smartphones
Heute schrieb ich an einer Kamera-App für mein Galaxy S2 Smartphone. Dabei habe ich relativ schnell festgestellt, dass das „offizielle“ Android SDK keine Schnittstelle zum Ändern der ISO-Einstellung der Kamera anbietet. Die mitgelieferte Samsung Kamera-App bietet diese Einstellung aber an.
Es gibt noch ein paar weitere Einstellungen in der Samsung-App, die über die offizielle Android-API nicht abgebildet werden.
Also habe ich mich gefragt: Wie komme ich auch in eigenen Apps an diese „versteckten“ Parameter? Das Internet konnte mir diesmal nicht helfen: Es gibt zwar viele mit dem gleichen Problem, aber niemand scheint eine Lösung zu haben.
Also mache ich mir einfach mal das Reflection-Interface von Java zu Nutze:
Und siehe da: Die Camera.Parameters-Klasse im Galaxy S2 offenbart alle möglichen öffentlichen Methoden: setISOValue, setMemColorEnhance, setSaturation, setContrast, setContinousAf u.v.m. zusammen mit ihren entsprechenden Gettern.
Getestet habe ich bislang setISOValue: Tatsächlich bringt setISOValue("100") , setISOValue("200"), setISOValue("400"), setISOValue("800") genau den Effekt, den man aus der Systemapp kennt.
Ich teste weiter…
Es gibt noch ein paar weitere Einstellungen in der Samsung-App, die über die offizielle Android-API nicht abgebildet werden.
Also habe ich mich gefragt: Wie komme ich auch in eigenen Apps an diese „versteckten“ Parameter? Das Internet konnte mir diesmal nicht helfen: Es gibt zwar viele mit dem gleichen Problem, aber niemand scheint eine Lösung zu haben.
Also mache ich mir einfach mal das Reflection-Interface von Java zu Nutze:
camera = Camera.open();
Camera.Parameters p = camera.getParameters();
Method[] mm = p.getClass().getMethods();
for(Method m : mm) {
String ps = "";
for(Class c: m.getParameterTypes()) {
ps += "[" + c.getName() + "] ";
}
String r = m.getReturnType().getName();
debug(m.getName() +": "+ ps + "->" + r, true);
}
Und siehe da: Die Camera.Parameters-Klasse im Galaxy S2 offenbart alle möglichen öffentlichen Methoden: setISOValue, setMemColorEnhance, setSaturation, setContrast, setContinousAf u.v.m. zusammen mit ihren entsprechenden Gettern.
Getestet habe ich bislang setISOValue: Tatsächlich bringt setISOValue("100") , setISOValue("200"), setISOValue("400"), setISOValue("800") genau den Effekt, den man aus der Systemapp kennt.
Ich teste weiter…
Dienstag, 31. Januar 2012
Über Symfony 2, Twig, Inheritance und Widgets
Ich war noch nie ein besonders großer von von Template-Engines (siehe http://technischer-fortschritt.blogspot.com/2012/01/uber-php-template-engines.html).
Umso mehr habe ich mich darüber gefreut, dass die Engine „Twig“, die bei Symfony 2 mitgeliefert wird, einen sehr ausgereiften Eindruck macht und mit der Template Inhertitance auch ein sehr wirksames Instrument zur Strukturierung von Templates mitliefert.
Typischerweise benutzt man Template Inhertitance, um ein Grundgerüst für eine Seite oder den Teil einer Seite zu definieren, um dieses Grundgerüst in Kind-Templates dann zu erweitern. Dabei geht die Kontrolle über den Seitenaufbau vom Kind-Template aus: Es entscheidet eigenständig, welches Basislayout es erweitern möchte (siehe auch Dynamic Inheritance)und überschreibt gegebenenfalls die Angaben des Eltern-Template.
Was aber ist mit dem „umgekehrten“ Fall, den man am ehesten mit einem Kompositum in der OOP vergleichen kann?
Ein Beispiel: Ich möchte in meinem Projekt Videos einbinden und habe mir dazu ein Template geschaffen, das einen Videoplayer mit allem Schnick und Schnack definiert. Ich nenne das ein Widget: Ein kleines Snippet auf der Seite, das aber neben dem reinen HTML-Anteil noch spezifischen Javascript- und CSS-Code mitbringt. Wenn ich mich recht erinnere, bezeichnete Symfony 1 das ganz ähnlich.
Ein Twig-Template dazu könnte etwa so aussehen:
Jeder mit ein paar Grundkenntnissen wird jetzt sagen: Kein Problem, das Template kannst Du doch einfach mit „include“ einbinden. Doch das geht leider fehl: Sowohl der Javascript- als auch der CSS-Block werden so nicht interpretiert, sondern einfach ignoriert. Im Ergebnis stehen das <script>- und das <link>-Tag plötzlich mitten in der Seite, anstatt an den dafür vorgesehenen Stellen im Header.
Klar könnte ich jetzt anfangen und mehrere Templates für meinen Videoplayer definieren: Eines für die Header-Includes (JS/CSS) und eines für den eigentlichen HTML-Part. Schön ist anders.
Übrigens macht der Einsatz von Assetic das Ganze auch nicht besser, sondern sorgt an dieser Stelle höchstens für unübersichtlicheren Code.
Bin ich blind? Was habe ich übersehen? Oder ist das Kompositum-Muster einfach in Twig nicht vorgesehen? Dabei kommt es mir so wichtig vor. Ich stehe ratlos vor diesem Phänomen und bin für jede Hilfe dankbar...
Umso mehr habe ich mich darüber gefreut, dass die Engine „Twig“, die bei Symfony 2 mitgeliefert wird, einen sehr ausgereiften Eindruck macht und mit der Template Inhertitance auch ein sehr wirksames Instrument zur Strukturierung von Templates mitliefert.
Typischerweise benutzt man Template Inhertitance, um ein Grundgerüst für eine Seite oder den Teil einer Seite zu definieren, um dieses Grundgerüst in Kind-Templates dann zu erweitern. Dabei geht die Kontrolle über den Seitenaufbau vom Kind-Template aus: Es entscheidet eigenständig, welches Basislayout es erweitern möchte (siehe auch Dynamic Inheritance)und überschreibt gegebenenfalls die Angaben des Eltern-Template.
Was aber ist mit dem „umgekehrten“ Fall, den man am ehesten mit einem Kompositum in der OOP vergleichen kann?
Ein Beispiel: Ich möchte in meinem Projekt Videos einbinden und habe mir dazu ein Template geschaffen, das einen Videoplayer mit allem Schnick und Schnack definiert. Ich nenne das ein Widget: Ein kleines Snippet auf der Seite, das aber neben dem reinen HTML-Anteil noch spezifischen Javascript- und CSS-Code mitbringt. Wenn ich mich recht erinnere, bezeichnete Symfony 1 das ganz ähnlich.
Ein Twig-Template dazu könnte etwa so aussehen:
{% block javascripts %}
<script src="video.js"></script>
{% endblock %}
{% block stylesheets %}
<link href="video-js.css" rel="stylesheet" type="text/css"></link>
{% endblock %}
{% block body %}
<video class="video-js vjs-default-skin" controls="controls" height="264"
id="example_video_1" preload="none" width="640"> poster="test.png" data-setup="{}">
<source src="test.mp4" type="video/mp4"></source>
</video>
{% endblock %}
Jeder mit ein paar Grundkenntnissen wird jetzt sagen: Kein Problem, das Template kannst Du doch einfach mit „include“ einbinden. Doch das geht leider fehl: Sowohl der Javascript- als auch der CSS-Block werden so nicht interpretiert, sondern einfach ignoriert. Im Ergebnis stehen das <script>- und das <link>-Tag plötzlich mitten in der Seite, anstatt an den dafür vorgesehenen Stellen im Header.
Klar könnte ich jetzt anfangen und mehrere Templates für meinen Videoplayer definieren: Eines für die Header-Includes (JS/CSS) und eines für den eigentlichen HTML-Part. Schön ist anders.
Übrigens macht der Einsatz von Assetic das Ganze auch nicht besser, sondern sorgt an dieser Stelle höchstens für unübersichtlicheren Code.
Bin ich blind? Was habe ich übersehen? Oder ist das Kompositum-Muster einfach in Twig nicht vorgesehen? Dabei kommt es mir so wichtig vor. Ich stehe ratlos vor diesem Phänomen und bin für jede Hilfe dankbar...
Abonnieren
Posts (Atom)