<a> Tag Attribut target=”_new”

In älteren und zum Teil auch noch in neueren Webseiten, findet man den Wert “_new” für das Attribute target beim a-Element. Um es gleich vorwegzunehmen: Dieser Wert ist nicht definiert und somit ein ungütltiger Wert. Leider musste ich feststellen, dass auch in einigen alten Webapplikationen, die ich erstellt habe, dieser Wert verwendet wird 🙁

Die Erklärung wieso “_blank” der richtige Wert dafür ist, findet man bei SELFHTML:

Viele Anwender verwenden statt target=”_blank” irgendeinen nicht existenten Framenamen oder sogar unzulässig target=”_new”, um einen Verweis in einem neuen Fenster zu öffnen. Das erzielt nicht den gewünschten Effekt, da das neue Fenster nicht fokussiert wird und der Anwender es unter Umständen nicht sieht (bei target=”_blank” wird das Fenster sehr wohl fokussiert). Außerdem werden andere Verweise, die diesen eigentlich nicht verwendeten Framenamen verwenden, ebenfalls in diesem neuen Fenster geöffnet.

Definierte und gültige Werte sind:

  • _blank um den Verweis in einem neuen Fenster zu öffnen (Achtung: nur zusammen mit rel=”noopener” verwenden),
  • _self um den Verweis im aktuellen Fenster zu öffnen,
  • _parent um bei verschachtelten Framesets das aktuelle Frameset zu sprengen,
  • _top um bei verschachtelten Framesets alle Framesets zu sprengen.

Qt: Thumbnails von Webseiten erstellen

Thumbnail des monsterli.ch Blog
Thumbnail das mit Hilfe von QWebpage und QPainter erstellt wurde

Das Qt Framework bietet mit dem Modul QtWebKit eine vollständige “Browser-Engine”, welche das Anzeigen und Bearbeiten von Webseiten ermöglicht. Dieses Modul ermöglicht auf einfache Weise Thumbnails von Webseiten zu erstellen. In der Dokumentation zu der Klasse QWebPage befindet sich auch eine Beispielklasse zum Erstellen von Thumbnails ohne Widgets zu verwenden. Muss also ein “Command Line Tool” erstellt werden, ist das der ideale Startpunkt.

Thumbnailer Beispielklasse

Die Header-Datei der Thumbnailer-Klasse:


#ifndef THUMBNAILER_H
#define THUMBNAILER_H
#include 
#include 
#include 

class Thumbnailer : public QObject
 {
     Q_OBJECT

 public:
     Thumbnailer(const QUrl &url);

 signals:
     void finished();

 private slots:
     void render();

 private:
     QWebPage page;

 };

#endif // THUMBNAILER_H

Die Thumbnailer-Klasse:


#include "thumbnailer.h"

Thumbnailer::Thumbnailer(const QUrl &url)
{
    page.mainFrame()->load(url);
    connect(&page, SIGNAL(loadFinished(bool)),
        this, SLOT(render()));
}

void Thumbnailer::render()
{
    page.setViewportSize(page.mainFrame()->contentsSize());
    QImage image(page.viewportSize(), QImage::Format_ARGB32);
    QPainter painter(&image);

    page.mainFrame()->render(&painter);
    painter.end();

    QImage thumbnail = image.scaled(400, 300);
    thumbnail.save("thumbnail.png");

    emit finished();
}

Die main-Klasse:


#include "thumbnailer.h"
#include 

int main(int argc, char *argv[])
{
    QApplication a( argc, argv);
    Thumbnailer myThumb(QUrl("https://www.google.com"));
    QObject::connect(&myThumb, SIGNAL(finished()), QApplication::instance(), SLOT(quit()));

    return a.exec();
}

 

Verwenden von Browser Plugins wie Adobe Flash

Verwendung von Plugins aktiviert
Verwendung von Plugins aktiviert
Verwendung von Plugins deaktiviert
Verwendung von Plugins deaktiviert

Damit auch die Flash-Elemente einer Webseite auf dem Thumbnail dargestellt werden, muss das Flash-Plugin bereits auf dem System installiert sein und das QWebSetting “PluginsEnabled” aktiviert werden:


page.settings()->setAttribute(QWebSettings::PluginsEnabled, true);

 

Nützliche Links

QT Beispiel Projekt
WebScreenie is small qt command-line utility to create snapshot of webpages.
QT-Code websnap

(C / C++): Bitmanipulation mit bitweise Operatoren

Bitweises Komplement / Bitwise NOT

Der NOT-Operator (~) invertiert jedes einzelne Bit einer Zahl.

Beispiel mit 8-Bits:

 0000 0100 = 4
~0000 0100 = 1111 1011 = 251

Bitweises UND / Bitwise AND

Der AND-Operator (&) wird auf jedes einzelne Bit zwischen zwei Operanden angewendet. Das Ergebnisbit ist 1, wenn beide Bits den Wert 1 aufweisen.

Beispiel mit 4-Bits:

 0001
&1001
-----
 0001

Bitweises ODER / Bitwise OR

Der OR-Operator (|) wird auf jedes einzelne Bit zwischen zwei Operanden angewendet. Das Ergebnisbit ist 1, wenn eines der beiden Bits den Wert 1 aufweisen.

Beispiel mit 4-Bits:

 0001
|1001
-----
 1001

Bitweises exklusives ODER / Bitwise XOR

Der XOR-Operator (^) wird auf jedes einzelne Bit zwischen zwei Operanden angewendet. Das Ergebnisbit ist 1, wenn die beiden Bits unerschiedliche Werte haben.

Beispiel mit 4-Bits:

 0001
^1001
-----
 1000

Linksverschiebung / Left shift

Bei der bitweise Linksverschiebung (<<) werden alle Bits um die angegebene Position nach links verschoben.

Beispiel mit 4-Bits:

0001 << 1 = 0010
0001 << 2 = 0100

Rechtsverschiebung / Right shift

Bei der bitweise Rechtsverschiebung (>>) werden alle Bits um die angegebene Position nach rechts verschoben.

Beispiel mit 4-Bits:

0010 >> 1 = 0001
0100 >> 2 = 0001
1010 >> 1 = 0101 

Bit löschen

Will man in einem Byte mehrere Bits auf 0 setzen, wird dazu die UND-Verknüpfung verwendet.

PORTB &= ~((1 << 0)

Löscht Bit 0

Sollen gleichzeitig mehrere Bits gelöscht werden:

PORTB &= ~((1 << 0) | (1 << 2));

Löscht Bit 0 und 2 in PORTB

Bit invertieren


PORTB ^= (1 << 3);

Invertiere das dritte Bit

Bit setzen


PORTB |= (1 << 2);

Setzt das Bit 2 auf 1

Beispiel Methoden:


void set_PORTB_bit(int8_t  position, int8_t  value)
{
	// Sets or clears the bit in position 'position'
	// either high or low (1 or 0) to match 'value'.
	// Leaves all other bits in PORTB unchanged.
	
	if (value == 0)
	{
                // Set bit # 'position' low
		PORTB &= ~(1 << position);
	}
	else
	{
                // Set bit # 'position' high
		PORTB |= (1 << position);
	}
}

void set_Pin_Mode(int8_t  position, int8_t  value){
	if (value == 0)
	{
                // Set bit # 'position' to input
		DDRB  &= ~(_BV(position));
	}
	else
	{
                // Set bit # 'position' to output
		DDRB  |= (1 << position);
	}
}

Nützliche Links

mikrocontroller.net: Bitmanipulation

wikipedia: Bitweiser Operator

stackoverflow.com: How do you set, clear and toggle a single bit?

LearnCpp.Com: Bitwise operators

AVR: Unterschied zwischen sleep_cpu() und sleep_mode()

Die zwei Methoden unterscheiden sich nur beim Handling des SE-Bit. Bei der Methode sleep_cpu() muss durch den Code sichergestellt werden, dass zuvor das SE-Bit gesetzt wird und nach dem Aufwachen der CPU das SE-Bit wieder gelöscht wird.

Beispiel mit sleep_cpu():


    sleep_enable();
    sleep_cpu();
    sleep_disable();

Beispiel mit sleep_mode():


    sleep_mode();

Nützliche Links

avr-libc: sleep

Einbinden von Skripts in VBScript-Dateien

Beim Arbeiten mit Skripts (.vbs Dateien) gelangt man oft an den Punkt, an dem Funktionen bereits in mehreren anderen Skripts erstellt und verwendet wurden. Dabei wäre es praktisch, wenn man im neuen Skript nur noch eine Funktionssammlung einbinden könnte um die bereits erstellten Funktionen zu verwenden.

Der VBScript-Code zum Einbinden von Dateien:


Sub Include(Byval filename)
  Dim codeToInclude
  Dim FileToInclude

  Const OpenAsDefault = -2
  Const FailIfNotExist = 0
  Const ForReading = 1
  Const OpenFileForReading = 1
  Dim FSO: Set FSO = CreateObject("Scripting.FileSystemObject")

  'Check for existance of include
  If Not FSO.FileExists(filename) Then
    wscript.Echo "Include file not found."
	Set FSO = Nothing
    Exit Sub
  End If

  'open file to include
  Set FileToInclude = FSO.OpenTextFile(filename, ForReading, _
  FailIfNotExist, OpenAsDefault)

  'read all contet of the file
  codeToInclude = FileToInclude.ReadAll
  
  'close file after reading
  FileToInclude.Close
 
  'now cleanup the unused objects
  Set FSO = Nothing
  Set FileToInclude = Nothing

  'now execute code from include file
  ExecuteGlobal codeToInclude
End Sub

Ein kleines Beispiel mit 2 Skript-Dateien:

Die Datei “include.vbs” enthält eine Funktion “hello()”, welche “Hello %name%” ausgibt:


sub hello(Byval person)
	wscript.echo "Hello " & person
end sub

Das Hauptskript ist in der Datei “sayHello.vbs” und bindet die Datei “include.vbs” mit der obigen Funktion ein.


call Include("include.vbs")
call hello("Thomas")

Nach dem Aufruf der Funktion “hello()”, erscheint wie erwartet “Hello Thomas” als Output. Somit wurde die Funktion “hello()” erfolgreich eingebunden.

Herunterladen der Demo-Dateien

VBScript: Text von UTF-8 nach Windows-1252 konvertieren mit dem ADO Stream-Objekt

Soll ein Text, der als UTF-8 codiert wurde, in eine andere Zeichencodierung umgewandelt werden, kann dazu das ADO Stream-Objekt verwendet werden. Die hier verwendete Codierung “Windows-1252” ist eine Untermenge des ISO-8859-1 Character Sets.


'/***
' @brief convert a utf-8 text to an Windows-1252 text
' @param utf8xml, value
' @return text with Windows-1252 character set
'***/
Function UTF8TOISO(byval utf8xml)
On Error Resume Next

Dim objStream
const adTypeText = 2

Set objStream = CreateObject( "ADODB.Stream" )
Set objStreamISO = CreateObject( "ADODB.Stream" )

objStream.Type = adTypeText
objStream.Charset = "utf-8"
objStream.Open

'write data to stream
objStream.WriteText utf8xml
objStream.Position = 0

objStreamISO.Type = adTypeText
objStreamISO.Charset = "Windows-1252"
objStreamISO.Open
objStreamISO.WriteText objStream.ReadText
objStream.Position = 0

If Err Then
UTF8TOISO = ""
Else
UTF8TOISO = objStreamISO.ReadText
End If

objStream.Close
objStreamISO.Close
Set objStream = Nothing
Set objStreamISO = Nothing
End Function

Die verwendeten Properties und Funktionen des Stream-Objekts sind:

  • .Open  Öffnet den Stream
  • .Close  Schliesst den Stream
  • .Charset  Legt fest, welche Zeichencodierung verwendet werden soll
  • .Type  Definiert ob es ein Binär- oder Textstream ist
  • .WriteText  Schreibt Textdaten in den Stream
  • .ReadText  Liest Textdaten vom Stream
  • .Position  Legt die Position im Stream fest (in Bytes)

Diese Funktion lässt sich auch leicht modifizieren, wenn der konvertierte Text in einer Datei gespeichert werden soll. Dazu muss nur die Funktion “.SaveToFile(filename, adSaveCreateOverWrite)” des ADO Stream aufgerufen werden.

Text UTF-8 codiert in einer Datei speichern

Um einen Text UTF-8 codiert in einer Datei zu speichern kann folgender Code verwendet werden:


'/***
' @brief save a text UTF-8 coded in a file
' @param textToSave, value
' @param filename, the name of the file to create
' @return true on no error or false on error
'***/
Function saveFileAsUTF8(byval textToSave, byval filename)
	On Error Resume Next
    Dim objStream
	const adTypeText = 2
	Const adSaveCreateOverWrite = 2
    
    Set objStream = CreateObject( "ADODB.Stream" )
	objStream.Charset = "utf-8"
	objStream.Mode = adModeReadWrite	
	objStream.Type = adTypeText
	objStream.Open
	
	'write data to stream and save to file
    objStream.WriteText textToSave	
	objStream.Flush
	objStream.Position = 0	
	objStream.SaveToFile filename, adSaveCreateOverWrite	
    
    If Err Then
        ISOTOUTF8 = false
    Else
		ISOTOUTF8 = true
    End If	

    objStream.Close
    Set objStream = Nothing
End Function

'Aufruf der Funktion
call saveFileAsUTF8("Die bunte Welt besteht aus einem grünen Wald, einer hässlichen Geschichte und dem öffentlichen Grund...", "D:\tmp\ASP\utf8.txt")

VBScript: Microsoft DNS-Server Einträge bearbeiten

Mit Hilfe der “DNS WMI Services” kann der Microsoft DNS Server verwaltet werden. Dies ermöglicht das Erstellen von Skripts zum Hinzufügen, Löschen oder Editieren von Zonen und Records.

Um mit den “DNS WMI Klassen” zu arbeiten sind folgende Schritte notwendig:

  1. WMI Service initiieren (remote oder lokal)
  2. Mit Hilfe des WMI Service kann dann die benötigte “DNS WMI Klasse” instanziiert werden

Lokalen WMI Service initiieren:


Dim objWMIService: Set objWMIService = GetObject("winmgmts:\\" & "." & "\root\MicrosoftDNS")

Remote WMI Service initiieren:


Dim objSWbemLocator: Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator") 
Dim objWMIService: Set objWMIService = objSWbemLocator.ConnectServer(hostIP, _ 
		"root\MicrosoftDNS", _ 
		username, _ 
		password, _ 
		"", _ 
		"") 	

Die Parameter:

  • hostIP = IP des DNS-Server
  • username = Benutzername
  • password = Passwort

Neue “Primary-Zone” erstellen:


Dim objDNSZone: Set objDNSZone = objWMIService.Get("MicrosoftDNS_Zone")
objDNSZone.CreateZone(zoneName,0)

Bedeutung der Parameter:

  • zoneName = Name der neuen Zone (monsterli.ch, switch.ch, usw.)
  • 0 = Zone des Typs: “primary zone”

Neue “Secondary-Zone” erstellen:


Dim objDNSZone: Set objDNSZone = objWMIService.Get("MicrosoftDNS_Zone")
objDNSZone.CreateZone(zoneName,1,false,zoneName & "dns",array(nsMasterIP))

Dabei sind die Parameter:

  • zoneName = Name der neuen Zone (Domain)
  • 1 = Zone des Typs: “secondary zone”
  • false = keine “AD integrated zone”
  • zoneName & “dns” = Name der Zonendatei
  • array(nsMasterIP) = Array mit der IP des primären Server dieser Zone

Neuer A-Record erstellen:


Dim objItem: Set objItem = objWMIService.Get("MicrosoftDNS_AType")
objItem.CreateInstanceFromPropertyData(masterDNSServer, zoneName, subZoneName , 1, 600, hostIP)

Die Parameter:

  • masterDNSServer = IP des primären Server
  • zoneName = Name der Zone (Domain)
  • subZoneName = gewünschter Hostname (www, mail, ftp… usw.)
  • 1 = Record Class IN (Internet)
  • 600 = TTL in Sekunden
  • hostIP = IP-Adresse des Hosts

Um weitere Records wie NS, MX, CNAME, usw. zu erstellen, muss einfach die “DNS WMI Class” geändert werden.

Zone löschen:

Um eine bestehende Zone zu löschen wird mit Hilfe der “.Get” Funktion des WMI-Service die Zone selektiert und gelöscht.


Dim objServer: set objServer = objWMIService.Get("MicrosoftDNS_Server.name="".""")
Dim objItem: Set objItem = objWMIService.Get("MicrosoftDNS_Zone.ContainerName=""" & zoneName & """,DnsServerName=""" & objServer.name & """,Name=""" &  zoneName & """")
if isObject(objItem) then
	objItem.delete_
end if

Benutzte Parameter:

  • zoneName = Name der Zone die gelöscht werden soll
  • objServer.name = Name des verwendeten DNS-Server
  • zoneName = Name der Zone die gelöscht werden soll

Nützliche Links

DNS WMI Provider Samples—Managing DNS Zones
Scripts to manage DNS Server

Mit VBScript OS Version bestimmen

Dieses Skript kann verwendet werden um die Server OS Version zu bestimmen. Das Skript liefert das Resultat für Windows 2000, Windows 2003, Windows 2008. Es kann jedoch auf einfache Weise erweitert werden, damit auch Client Versionen zurückgeliefert werden.


'/*
'	check windows version
'	return: 
'			win2k for windows 2000
'			win2k3 for windows 2003
'			win2k8 for windows 2008
'			unknown if the os is older / newer
'*/
function getOSVersion()
	strWinVersion = ""
	set objWMIService = GetObject("winmgmts:" _
		& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
	Set colOperatingSystems = objWMIService.ExecQuery _
		("Select * from Win32_OperatingSystem")
	For Each objOperatingSystem in colOperatingSystems
			strWinVersion = objOperatingSystem.Version
	Next

	'/**/	
	strMajor = left(strWinVersion,3)
	strOS = ""
	SELECT CASE strMajor
	case "5.0"
		'WScript.Echo "Windows 2000"
		strOS = "win2k"
	case "5.2"
		'WScript.Echo "Windows 2003"
		strOS = "win2k3"
	case "6.0"
		'WScript.Echo "Windows 2008"	
		strOS = "win2k8"
	case else
		'WScript.Echo "Windows x?" & "(" & strWinVersion & ")"
		strOS = "unknown"
	end select
	getOSVersion = strOS
End Function

VBScript: Windows Service remote starten und stoppen

Dank der WMI-Schnittstelle ist es möglich ein Skript zu schreiben, das auf einem remote System einen Service überwacht und bei Bedarf auch neu starten oder stoppen kann.


Dim objWMIService
Dim lServices
Dim strService: strService = "MeinService"
Dim strComputer: strComputer ="."

Set objWMIService = objSWbemLocator.ConnectServer("10.0.200.33", "root\cimv2", _
"Benutzer", _
"Passwort", _
"","")


Set lServices = objWMIService.ExecQuery("Select * from Win32_Service Where Name='" & strService & "'")
For Each objService In lServices
    Select Case objService.State
     case "Stopped" 'start service
          errReturn = objService.StartService()
     case "Paused" 'resume service
          errReturn = objService.ResumeService()
     case "Running" 'nothing todo
          wscript.echo objService.Name & " with ID " & objService.ProcessId & " is already started."
     End Select
Next

Anmerkung zu den Codezeilen:

  • 03 Achtung: bei der Definition des Servicenamen handelt es sich nicht um den Anzeigenamen sondern um den Dienstnamen
  • 06 Remote WMI Service initiieren (auch lokaler möglich)
  • 12 Mit einer WQL Abfrage wird der gesuchte Dienst selektiert um dann mit diesem Arbeiten zu können
  • 14 Status des Dienstes abfragen (Mögliche Werte sind: “Stopped”, “Start Pending”, “Stop Pending”, “Running”, “Continue Pending”, “Pause Pending”, “Paused”, “Unknown”)
Eigenschaften des Dienstes Anwendungsverwaltung
Bei der WQL-Abfrage den Dienstnamen verwenden und nicht den Anzeigenamen

Nützliche Links:

Managing Windows with WMI
WMI Query Language (WQL)
Win32_Service Class Proberties

WMI Scripting Primer: Part 1
WMI Scripting Primer: Part 2
WMI Scripting Primer: Part 3

VBScript: Standard Pingabfrage mit WMI

Um zu überprüfen ob ein Host im Netzwerk erreichbar ist, kann man eine standard Pingabfrage verwenden.

Mit der “Win32_PingStatus WMI CLASS” bietet Microsoft die Möglichkeit eine solche standard Pingabfrage in einem VBScript zu verwenden.


Dim hostToPingFrom: hostToPingFrom= "localhost"
Dim targetIP: targetIP = 8.8.8.8

Dim cPingResults: Set cPingResults = GetObject("winmgmts:{impersonationLevel=impersonate}//" & _
hostToPingFrom & "/root/cimv2"). ExecQuery("SELECT * FROM Win32_PingStatus " & _
"WHERE Address = '" + targetIP + "'")

For Each oPingResult In cPingResults
    If oPingResult.StatusCode = 0 Then
       wscript.echo "Host is reachable"
    End if
Next

  • Zeilen 4,5,6: Verschickt die Pingabfrage
  • Zeile 8: Iterieren über die Ping-Resultate
  • Zeile 9: Ist der Statuscode 0 war das Pingkommando erfoglreich. Weitere Statuscodes werden in der Dokumentation zur “Win32_PingStatus class” beschrieben.

ping-checker.vbs

Ein kleines VBScript, das ein Ping sendet und bei einem Fehler eine Benachrichtigung als Email, über einen SMTP-Server, verschickt oder in der Windows Konsole anzeigt. Je nach Konfiguration. Dieses einfache Skript kann als Grundlage dienen, um sich ein eigenes, den Bedürfnissen angepasstes Skript zu erstellen.

ping-checker.vbs als 7zip herunterladen

ping-checker.vbs output
Der Konsolen-Output des Skriptes, da der Host 192.168.88.55 nicht erreichbar war.

Nützliche Links

Microsoft: Win32_PingStatus class
Wikipedia: Ping