Archive

Posts Tagged ‘javascript’

Gadgets with transparent background

August 7th, 2009 No comments


transparent gadget

transparent gadget

There again Microsoft afforded something. Who of you already tried to provide a gadget with transparent background but not to do it without CSS formatting, tear one’s hair.


It is simply impossible to put a transparent picture on the background and finish. As soon as I want to place a second semi-transparent image on top or simply write some text into the gadget, I’ll have a cute secondary effect: All will get a neat magenta coloured border (as you can see on the picture).

This results on a bug in the anti-aliasing engine of the sidebar, which causes problems with alpha-cannels. Microsoft use a magenta coloured mask for transparency in sidebar and this won’t be erased completely if using semi-transparency. Thus these develop nice edges with the anti-aliasing of images or text.

You can minimise this on images, by putting only e.g. GIF files on top of PNG background images (who don’t use semi-transparent images on top can use e.g. JPG either), because only PNG use alpha-cannels. But the problem with the text remains existing.

However, Microsoft provide us one alternative method, as we can use the Tag <g:background ... > or the JavaScript variant addImageObject() . For this, either take a look at MSDN g:background Element.

Example:

<html>
    <head>
        <title>Hello World</title>
        <script type="text/jscript" language="jscript">
        function init()
        {
            System.Gadget.background = "images\\background.png";
        }
        </script>
    </head>

    <body onload="init()">
        <g:background id="imgBackground">
            Hello World!
        </g:background>
    </body>
</html>


The crucial disadvantage of this possibility is that thereby no events – like e.g. mouse click or mouse movement – are passed on, since images merged in such a way becomes part of the background.

Now my consideration goes by, whether I will really do myself this cramp and converts my gadget completely, or try to go around the restrictions with cheats so that all functions remain and I nevertheless get a transparent background. :schulterzuck:


Da hat sich Microsoft ja mal wieder was geleistet. Wer von Euch schonmal versucht hat ein Gadget mit transparentem Hintergrund zu erstellen und dabei auf CSS Formatierung nicht verzichten möchte, der rauft sich die Haare.

Es ist schlicht unmöglich einfach nur eine transparente Grafik zu nehmen, diese auf den Hintergrund zu legen und fertig. Sobald ich eine weitere Grafik mit semi-transparenten Teilen darüber lege oder auch einfach nur Schrift ins Gadget einfüge, bekomme ich einen netten Nebeneffekt, über den sich unser großes T hier in Deuschland sicher freut: Alles bekommt einen netten Rand in Magenda (auf der nebenstehenden Grafik zu sehen).

Das liegt an einem Bug der Anti-Aliasing Engine der Sidebar, der Probleme mit den Alphakanälen hat. Microsoft verwendet für die Transparenz bei der Sidebar eine magentafarbene Maske, die bei Teiltransparenz nicht vollständig entfernt wird. Dadurch entstehen beim Anti-Aliasing von Grafiken oder Schriften diese netten Ränder.

Vermindern läßt sich das bei Grafiken, indem man über den aus einer transparenten PNG Grafik bestehenden Hintergrund nur z.B. GIF Dateien legt (wer auf transparente Grafiken verzichten kann, kann auch z.B. JPG nutzen), weil nur PNG Alphakanäle unterstützt. Aber das Problem bei den Schriften bleibt weiter bestehen.

Eine (proprietäre) Alternative liefert Microsoft uns aber gleich mit, indem wir den Tag <g:background ... > oder die JavaScript Variante addImageObject() nutzen. Siehe dazu auch MSDN g:background Element.

Beispiel:

<html>
    <head>
        <title>Hello World</title>
        <script type="text/jscript" language="jscript">
        function init()
        {
            System.Gadget.background = "images\\background.png";
        }
        </script>
    </head>

    <body onload="init()">
        <g:background id="imgBackground">
            Hello World!
        </g:background>
    </body>
</html>


Der entscheidende Nachteil dieser Möglichkeit ist, daß dadurch keine Ereignisse – wie z.B. Mausklick oder -bewegung – weitergeleitet werden, da die so eingebundene Grafik Teil des Hintergrundes wird.

Nun geht meine Überlegung dahin, ob ich mir wirklich diesen Krampf antun werde und mein Gadget komplett umbaue, mit Tricks versuche die Einschränkungen zu umgehen, damit alle Funktionen erhalten bleiben und ich trotzdem einen transparenten Hintergrund bekomme. :schulterzuck:


getElementsByClassName

Juli 14th, 2009 No comments

Manchmal vermisse ich die Möglichkeit alle CSS-Elemente erfassen zu können, denen der gleiche Klassenname zugewiesen wurde.

Im SelfHTML Forum wurde ich dann fündig, denn dort suchte jemand genau dazu ebenfalls eine Lösung.

Es wird dabei über alle Elemente eines Dokuments hinweg eine Abfrage der Eigenschaft className durchgeführt. Beim IE erreicht man das durch die Referenzen document.all auf alle Elemente, wohingegen Netscape 6+ / Mozilla und Opera7 das mit Hilfe von document.getElementsByTagName(“*”) ermöglichen.

Beim Aufruf wird der Funktion ein Klassenname übergeben, anhand dessen ein Objekt-Array (ret_obj) erstellt und zurückgegeben wird.


function getElementsByClassName(class_name)
{
	var all_obj,ret_obj=new Array(),j=0,teststr;
	if(document.all)all_obj=document.all;
	else if(document.getElementsByTagName && !document.all)all_obj=document.getElementsByTagName("*");
	for(i=0;i<all_obj.length;i++)
	{
		if(all_obj[i].className.indexOf(class_name)!=-1)
		{
			teststr=","+all_obj[i].className.split(" ").join(",")+",";
			if(teststr.indexOf(","+class_name+",")!=-1)
			{
				ret_obj[j]=all_obj[i];
				j++;
			}
		}
	}
	return ret_obj;
}

Meiner Meinung nach eine tolle Alternative, wenn man per Javascript eine ganze Klasse umformatieren möchte.

Die Sidebar und CreateObject(“WScript.Shell”)

Juli 6th, 2009 1 comment

It is to excite :motzen:

For a long time it annoys me that I cannot work from the Vista Sidebar by VBScript with CreateObject(“WScript.Shell”). Seems as if Microsoft would have prevented that, thus for harming software it is more difficulty to do bad things.

There are a few cheats to go around this, but if I want to get the output of a command prompt by using VBScript, then only the detour helps to temporarly write the result into a file.

However, such a thing I do not want!

Fortunately ‘s there still Javascript and the new ActiveXObject(“WScript.Shell”) with which I always marvelously could help me so far.

Well, so far in Vista. Now I have this function in my beta of margu-NotebookInfo2 2.1.0 for the moment to work over with the powerplans. I make that – because I still didn’t found no better way on script basis – to query and also change hose available powerplans by the command line.

There I was surprised why this module of my Gadget won’t function under Windows7 RC and had to state that not only the VBScript function of the CreateObject, but now also the counterpart in Javascript, which works at least in Vista, is deactivated.

And now I stand there and seek desperately in the net already for a solution with which I can live.

Thus it dows not surprise that I still stand on beta4 of my gadget, because finally my gadget shall work with Windows7 too.

Es ist zum Aus-der-Haut-fahren :motzen:

Schon lange wurmt mich, daß man aus der Vista Sidebar heraus nicht per VBScript mit CreateObject(“WScript.Shell”) arbeiten kann. Scheint als hätte Microsoft das unterbunden, damit es für Schadsoftware schwieriger ist böse Dinge anzustellen.

Es gibt zwar ein paar Tricks um das zu umgehen, aber wenn ich möchte, daß das VBScript mir z.B. die Ausgabe von einer Kommandozeile zurückgibt, dann hilft nur der Umweg über eine Datei in die man das Ergebnis temporär schreibt.

Sowas will ich aber nicht!

Zum Glück gibts ja da noch JavaScript und das new ActiveXObject(“WScript.Shell”) womit ich mir bisher immer wunderbar helfen konnte.

Tja, soweit in Vista. Nun habe ich diese Funktion im Moment in meiner Beta von margu-NotebookInfo2 2.1.0 um mit den Energiesparplänen zu arbeiten. Das mache ich – weil ich noch keinen besseren Weg auf Scriptbasis gefunden habe – um über die Kommandozeile die vorhanden Energiesparpläne abzufragen und auch zu wechseln.

Da wunderte ich mich, warum dieses Modul meines Gadgets nicht unter Windows7 RC funktioniert und mußte feststellen, daß dort nicht nur die VBScript Funktion des CreateObject deaktiviert ist, sondern jetzt auch das JavaScript Pendant, welches zumindest in Vista funktioniert.

Und nun stehe ich da und suche schon verzweifelt im Netz nach einer Lösung mit der ich leben kann.

Also nicht wundern, warum ich vorerst auf der Beta4 stehen bleibe, denn schließlich soll mein Gadget auch unter Windows7 funktionieren.


Gadgets

Juni 10th, 2009 No comments

Fritz!Box goes Sidebar

Mai 15th, 2009 No comments

Ich plage mich ja schon lange mit dem Wunsch herum, ein Sidebar Gadget zu haben, welches mir Status Informationen meiner Fritz!Box anzeigt. Aber es sollen nicht einfach nur Informationen angezeigt werden, sondern meine Wünsche gehen gleich so weit, daß ich auch mit der Anruferliste, dem Telefonbuch, Möglichkeit für einen ReConnect usw. “rummachen” können möchte.

Tja, nun gibts ja viele Wege die nach Rom, respektive zur Fritz!Box, führen. :hmm:

Einer wäre, einfach das Webinterface zu parsen.

Vorteile:

  • relativ leichte Durchführung
  • schneller Zugriff


Nachteile:

  • sehr anfällig für Anderungen am Webinterface seitens AVM
  • Login Daten sind fast schon zwingend notwendig
  • schlechte Usability – zumindest wenn Du, so wie ich, fast gänzlich auf Usereingaben (IP Adresse des Router, Logindaten usw.)  auskommen willst.


Dann gibt es noch die Möglichkeiten, die UPnP bietet.

Vorteile:

  • standardisiertes Protokoll
  • unabhängig von der Übertragungstechnik, solange es IP basierend ist (z.B. Ethernet, WLAN, Bluetooth, USB, Firewire)
  • läuft mit jeder Fritz!Box
  • auch branchenfremde Router dürften damit abgefragt werden können


Nachteile:

  • arschlahm
  • UPnP muß auf dem Router eingeschaltet sein (ok, bei der Fritz!Box nicht so tragisch, weil man die Möglichkeit hat, Schreibzugriffe per UPnP zu unterbinden. Somit besteht nicht Gefahr, daß jemand Böses einfach ein paar Routen ein- bzw. Ports freischaltet)
  • Schwierig per JavaScript bzw. VBScript abzugreifen

Und mit diesem letzten Punkt komme ich auch schon zu meinem momentanen Hauptproblem:

Ich bin nun keiner, der schon seit Jahren nichts anderes macht als mit Java- oder VBScript zu scripten, und somit fällt es mir noch ziemlich schwer mit DOM bzw. SOAP zu arbeiten. Aber gerade das ist nötig um mit UPnP tolle Ergebnisse zu erhalten.

Eine Hochsprache gehört leider auch nicht zu meinen Skills (hätte ich vor einigen Jahrzehnten mal in meiner Ausbildung die mir angebotene Möglichkeit genutzt auf eine Programmiererschule zu gehen :schulterzuck: ), sonst würde ich da sicher auch leichter zu einem brauchbaren Resultat kommen.

Wie dem auch sei, meine Pläne habe ich ja nun schon gesteckt. Eine etwaige Vorstellung, wie das Gadget mal aussehen und was es können soll, habe ich auch schon. Nun geht es “nur noch” :chuckle: darum das Ganze umzusetzen.

Erste Erfolge konnte ich schon verzeichnen. :stolz: So hab ich es geschafft, per VBScript über UPnP die externe IP meiner Box abzufragen. 8)

Mich stört eigentlich ganz mächtig, daß die Abfragen per UPnP so extrem lahm sind. Es braucht locker 5 Sekunden, damit das Script erstmal im Netz nach ICDs (Internet Connection Devices) sucht, dann den davon findet, der die Internetverbindung zur Verfügung stellt (also der, der online ist) und dann die vom Provider zugewiesene IP zu erfragen und auszugeben.

Das ist definitiv zu lange! :down:

Gut, später, wenn das Gadget erstmal läuft, wäre es zu verschmerzen da die Abfrageintervalle vermutlich so um die 30 oder 60 Sekunden wären, aber schon beim ersten Start dauert es zu lange. Wenn es dann sein sollte, daß es im Netz mehrere ICDs gibt, dann brauche ich eine Userrückmeldung. Der User muß aus den verfügbaren Routern den auswählen, von dem er den Status sehen möchte.

Da aber jede UPnP-Abfrage an den oder die Router so lange dauert, sind auch die Reaktionszeiten zu lange, bevor der User eine Änderung bekommt oder den nächsten Schritt gehen kann (z.B. die Settings Page wieder schließen).

Naja, ich bin da am Ball (soweit ich neben dem NotebookInfo2 Gadget Zeit habe) und hoffe bald eine akzeptable Lösung gefunden zu haben.

Die Beta des Gadget werde ich natürlich dann hier auf meiner Seite zur Verfügung stellen und hoffe auf fleißige Rückmeldungen von Euch, damit das Gadget genau das wird, was wir uns alle darunter vorstellen.

Aber Ihr könnt auch vorab schon hier einen Kommentar hinterlassen mit Wünschen, Anregungen oder vielleicht auch den einen oder anderen Tip, wie ich per Script die ganze Sache einfach und sauber lösen kann.

Ich verbleibe dann erstmal mit meinem Traum :ooom:

Nachtrag: Wie einige ja sicher schon mitbekommen haben, nimmt das Gadget langsam Formen an. Hatte mich entschlossen nicht erst bis zur Beta zu warten um damit in die Öffentlichkeit zu gehen.  Eine alpha Version vom Gadget mit Beschreibung findet ihr in diesem Artikel.