So funktioniert GPS

Das Global Positioning System (GPS) ist die Grundlage aller modernen Navigationssysteme -sei es im Flugzeug, im Auto, auf hoher See, oder beim Bergwandern. Hier eine Beschreibung, wie GPS eigentlich funktioniert:

{IMG(fileId="37",thumb="y",rel="box[g]",imalign="left",align="left")}{IMG} GPS wurde 1978 vom amerikanischen Verteidigungsministerium (Departement of Defense DoD) ins Leben gerufen. Das System verwendet 24 Satelliten. Sie umkreisen die Erde in Knapp 20’000 Km zur Erdoberfläche im 12 Stunden Rhythmus auf sechs verschiedenen Umlaufbahnen. Jeder Satellit sendet 50 mal pro Sekunde 3 verschiedene Signale, die das GPS Signal bilden:

    1. Signal: Den Pseudo- Zufalls Code, der jeden Satelliten eindeutig identifiziert. Ausserdem erledigt dieser Code die wichtigste Funktion im System: Er sorgt für die Positionsbestimmung. Der GPS Empfänger bestimmt seine Position vom Abstand zum Satelliten.

2. Signal: Das Almanach-Signal: Jeder Empfänger verfügt über einen Almanach, der ihm sagt, wann sich welcher Satellit wo befindet. Mit dem Signal wird diese Datenbank ständig aktuell gehalten.

3. Signal: Ein Zeitkorrektur-Signal, damit GPS-Empfänger ihre Uhren im Bedarfsfall mit den Satelliten-Uhren synchronisieren können, um so den Pseudo-Zufalls-Code exakt abgleichen zu können. Mit nur einem Satellitensignal kann jedoch noch keine Position im Raum bestimmt werden. Für eine halbwegs präzise Bestimmung bedarf es mindestens dreier Signale von verschiedenen Satelliten (Triangulation, siehe Abbildung). Der GPS- Empfänger errechnet aus den unter- schiedlichen Laufzeiten der Signale seine Position. Das DoD möchte verhindern, dass fremde Mächte oder Terroristen uneingeschränkt auf GPS zugreifen können. Deshalb senden die Satelliten zwei Pseudo-Zufalls-Signale auf unterschiedlichen Frequenzen aus. Das zivile Signal wird vom US-Verteidigungsministerium mit einem künstlichen Timing-Fehler versehen, der die Genauigkeit der Positionsbestimmung auf zirka 30 Meter beschränkt. Mit mathematischen Funktionen im Empfänger kann der Fehler bis zu einem gewissen Grad kompensiert werden, so dass sich eine grössere Genauigkeit als 30 Meter erzielen lässt, auch wenn sich die Systeme bewegen. Aber auch andere, nicht künstlich herbeigeführte Faktoren, können die Positionsermittlung behindern:
Störungen in der Atmosphäre, ungünstige Satellitenkonstellationen und vor allem eine Behinderung der Sichtverbindung zum Himmel. Wird GPS zur Routenplanung im Auto eingesetzt, braucht es das passende Kartenmaterial. Die vektorisierten Karten sind auf CD gespeichert und enthalten Positionsmarkierungen, die vom GPS-System mit den Satellitensignalen abgeglichen werden. So lässt sich die Position darstellen und die Route zum Ziel errechnen. Zusätzlich zu den Daten aus dem All wird der Navigationscomputer mit Daten von Sensoren am Fahr- zeug gefüttert, um die Genauigkeit der Position zu erhöhen. Ein Gyroskop (ähnlich einem Träghoheitskompass) und das Tacho-Signal geben Aufschluss über Fahrtrichtung, Geschwindigkeit und die Länge von Kurven. Mit den Daten kann auch ein kurzer Verlust des Satelliten Signals überwunden werden.

In einer Excel Tabelle lesen/schreiben

Mit dem folgenden Code kann man eine Excel Tabelle öffnen und lesen / schreiben.

Hinweis: MS Excel muss dazu auf dem System installiert sein.

'Excel im Hintergrund öffnen, Objekt erstellen und "Tabelle1" öffnen
Set Excel = CreateObject("Excel.Application")
Excel.Visible = False
Excel.Workbooks.Open "C:beispiel.xls"
Set sheet = Excel.Worksheets("Tabelle1")
 
'Alle Daten im aktuellen Druckbereich leeren
'Hinweis: Die Formattierung bleibt dabei erhalten
Excel.ActiveSheet.UsedRange.ClearContents
 
'Schreibe etwas in die erste Zelle in der ersten Zeile
sheet.Cells(1, 1) = "Dieser Text wurde Automatisch geschrieben! ;-)"
'Noch das aktuelle Datum in die 1. Zelle, Zweite Zeile schreiben
sheet.Cells(2, 1) = "Erstellt am: " & Now()
 
'Excel beenden und Objekt löschen
Excel.ActiveWorkbook.Save
Excel.ActiveWorkbook.Close
Excel.Quit
Set Excel = Nothing

Zugriff auf Access Datenbanken

Einleitung:
Da man auch in Visual Basic oft mit Datenbank zugriffen arbeitet, wird hier eine unabhängige, flexible Datenbank-Zugriffs Lösung als die, die in vielen Visual Basic Büchern beschreiben ist gezeigt.
Die Lösung basiert auf "SQL" und ist wird auch in anderen Programmiersprachen verwendet. SQL lässt sich auch ganz gut in Visual Basic einbinden.

Was ist SQL?
SQL = Structured Query Language, wird dazu verwendet um unabhängige Datenbank abfragen auszuführen. Es spielt dabei keine Rolle, was für eine Datenbank (Access, mySQL, DBase) verwendet wird.
Selbstverständlich kann man mit SQL noch viel mehr machen als nur einfache abfragen auszuführen, wen also die Datenbank Anbindung interessiert, wird empfohlen, hierzu weitere Literatur zu beschaffen.

Einfache SQL Anweisungen
Mit sogenannten "SQL Statements" kann man auf eine Datenbank verschiedene Arbeiten durchführen, bsp. Auslesen, Eintragen oder Löschen:

Abfragen mit SELECT
Mittels dem Befehl SELECT können einzelne Felder, Datensätze oder ganze Tabellen abgefragt werden.
Syntax: SELECT TabellenFeld FROM Tabelle [WHERE TabellenFeld = Wert]

Einfügen mittels INSERT
Mittels INSERT können Datensätze eingefügt werden
Syntax: INSERT INTO Tabelle [(Tabellenfeld1, Tabellenfeld2)] VALUES (‚Wert1‘, ‚Wert2‘)

Modifizieren mittels UPDATE
Mittels UPDATE können Datensätze modifiziert werden
Syntax: UPDATE Tabelle WHERE TabellenFeld = ‚Wert‘ SET (TabellenFeld1 = ‚Wert1‘, TabellenFeld2 = ‚Wert2‘)

Welche Schritte sind zu tun, um auf eine SQL Datenbank zuzugreifen?
Um mit SQL auf eine (Access) Datenbank zuzugreifen sind zunächst einige Schritte erforderlich, das nachfolgende Beispiel veranschaulicht dies:

'--Dieser Teil braucht nur einmal gemacht zu werden--
'Variablen deklarieren
Dim Conn As Object      'Objekt für die DB Verbindung
Dim SQLQUERY As Object  'Hier werden die SQL abfragen abgelegt
Dim DBPath As String    'String für den DB-Pfad
Dim SQL As String       'String für die SQL abfragen
 
'Datenbank Pfad bestimmen
DBPath = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=K:daten.mdb"
 
'Datenbank Objekt erstellen
Set Conn = CreateObject("ADODB.Connection")
 
'Die Datenbank öffnen (Conn)
Conn.Open DBPath
 
'--Dieser Teil wird jeweils vor jeder abfrage ausgeführt--
'SQL Befehl festlegen
SQL = "SELECT * FROM tblLogin"
 
'Den SQL Befehl auf die Datenbank ausführen und die Abfrage
'in der "Variablen"* SQLQUERY speichern
Set SQLQUERY = Conn.Execute(SQL)
 
'Solange die Datenbank nicht am ende angelangt ist
'(EOF = EndOfFile) Gib das Feld "UserLoginName" aus
While Not SQLQUERY.EOF
  MsgBox (SQLQUERY("UserLoginName"))
  SQLQUERY.MoveNext
Wend
'Gehe wieder zum ersten Datensatz
SQLQUERY.MoveFirst
 
 
'--Dieser Teil kommt jeweils immer am schluss--
'Datenbank schliessen
Conn.Close
 
 
<ul>
<li> SQLQUERY ist eigentlich ein Objekt, es fällt aber leichter, dies als Variable darzustellen.

Webseite einlesen

Diese Funktion läuft auch mit VBScript, ASP, VBA.

Aufruf (Beispiel):

fetch_page = getURL("<a href="http://www.example.com/")" target="blank">http://www.example.com/")</a>
msgbox fetch_page
Private Function GetURL(URL)
 
  ' --- Konstanten für die Verwendung eines ADODB.Stream-Objektes
  Const adTypeText = 2
  Const adReadAll = -1
 
  ' --- Instantiieren des Objekts MSXML2.ServerXMLHTTP
'  Set objHTTP = Server.CreateObject("MSXML2.ServerXMLHTTP.4.0")
 
  ' --- für XML 3 !
Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
 
  ' --- Instantiieren des
  Set objStream = CreateObject("ADODB.Stream")
  ' --- Einstellen der Timeouts in Millisekunden
  ' --- Es gibt 4 Parameter, die in der nachstehenden Reihenfolge angegeben werden müssen
  ' -----------------------------------------------------
  ' --- resolveTimeout - Auflösen des Hostnamens
  ' --- connectTimeout - Verbinden mit dem Host
  ' --- sendTimeout - Senden eines Datenpaketes an den Server
  ' --- receiveTimeout - Empfangen eines Datenpaketes vom Server
  ' -----------------------------------------------------
  objHTTP.SetTimeouts 5000, 5000, 5000, 5000
 
  ' --- Erstellen des Requests mit folgenden Parametern
  ' --- bstrMethod - Request-Methode
  ' --- bstrURL - Adresse der Seite, die ausgelesen werden soll
  ' --- varAsync - Laden der Seite asynchron (Wenn false, wird synchron geladen)
  objHTTP.open "GET", URL, false
 
  ' --- Senden des Requests
  objHTTP.send
 
  ' --- Datenstrom öffnen und den Typ TEXT festlegen
  objStream.Open
  objStream.Type = adTypeText
 
  ' --- Den Inhalt des ResponseBody in das Stream-Objekt schreiben
  objStream.WriteText(objHttp.ResponseBody)
 
  ' --- An den Anfang des "Stromes" positionieren
  objStream.Position = 0
 
  ' --- Deuschsprachingen Zeichensatz einstellen
  objStream.Charset = "latin1"
 
  ' --- Der gesamte Text der geladenen Seite wird jetzt in das Stream-Objekt
  ' --- eingelesen und als Rückgabewert der Funktion GetURL zugewiesen.
  ' --- Und abschließend muss das Objekt wieder geschlossen werden.
  GetURL = objStream.ReadText(adReadAll)
  objStream.close
 
  ' --- Terminieren der Objekte
  Set objStream = Nothing
  Set objHTTP = Nothing
End Function

CD Laufwerke zuhinterst umbenennen

Die CD Laufwerke werden in Windows relativ willkürlich angeordnet. -Dies gibt vor allem nach Neuinstallation, oder hinzufügen von Datenträgern Probleme.

Besser wäre es, wenn alle CD-Laufwerke von hinten her angeordnet wären, also das erste: Z, das zweite X, das dritte Y, usw.

Der nachfolgende Code bewerkstelligt in Zusammenarbeit mit dem Tool Diskpart, dass in Windows XP schon standardmässig enthalten ist genau das.

' VARIABLES
i = 90
 
' OBJECTS
Set fs = createobject("Scripting.FileSystemObject")
Set wshShell = CreateObject("WScript.Shell")
 
' Get all Drives and initialize each CD-ROM Drive
actDriveLetter = "0"
Set Drives = fs.Drives
 
' Create file for reassigment with diskpart in temporary folder
fn = fs.Getspecialfolder(2) & "cd_rename.txt"
Set renFile = fs.Opentextfile(fn, 2, True)
 
For each myDrive in Drives
  If myDrive.Drivetype = 4 Then
    actDriveLetter = myDrive.Driveletter
    newDriveLetter = chr(i)
    i = i - 2
 
    renFile.Writeline "Select Volume " & actDriveLetter
    renFile.Writeline "Assign Letter=" & newDriveLetter
 
  end if
Next
renFile.Close
 
 
' Run Diskpart to rename drives
myCMD = "Diskpart.exe /s " & fn
result = wshShell.Run(myCMD ,,true)
 
' Cleanup
If fs.FileExists(fn) Then
  wshShell.Run(fn)
  'fs.DeleteFile(fn)
End if
set fs = nothing
set wshShell = nothing

Laufwerks-Buchstaben abhängig vom Disklabel zuweisen

Möchte man nach einer Neuinstallation die Laufwerksbuchstaben automatisch anpassen, kann man dies anhand des Labels (= Laufwerks-Name) tun.

Folgender Ausschnitt weisst der Festplatte mit dem Namen BACKUP den Buchstaben "L:" zu.

<B>Hinweis:</B> Das Beispiel benötigt "diskpart", dass aber bei Windows XP standardmässig schon dabei ist.

Weitere Infos dazu gibts unter: http://groups.msn.com/windowsscript/powershell.msnw?action=get_message&mview=0&ID_Message=15313&LastModified=4675570881377551875&all_topics=1

' Objekte die wir brauchen (FSO und WSHShell) erstellen
Set fs = createobject("Scripting.FileSystemObject")
Set wshShell = CreateObject("WScript.Shell")
 
 
' Textdatei für diskpart erstellen
fn = fs.Getspecialfolder(2) & "hd_rename.txt"
Set renFile = fs.Opentextfile(fn, 2, True)
 
 
' Nun alle Festplatten-Laufwerke (Drivetype 2) durchgehen und wenn das Label
' gefunden wurde dieses zum umbenennen in die Textdatei schreiben.
' HINWEIS: Beim Select Case kann man natürlich so viele Cases machen wie man
'                 benötigt, einfach das "BACKUP"-Beispiel kopieren
For each myDrive in Drives
  If myDrive.Drivetype = 2 Then
    Select Case myDrive.VolumeName
      Case "BACKUP"
        renFile.Writeline "Select Volume " & myDrive.DriveLetter
        renFile.Writeline "Assign Letter=L"
 
      'Case Else
      '  msgBox myDrive.VolumeName
    End select
  end if
Next
 
 
' Textdatei schliessen
renFile.Close
 
 
' Diskpart laufen lassen und dabei die umbenennungs Textdatei mitgeben
myCMD = "Diskpart.exe /s " & fn
result = wshShell.Run(myCMD ,,true)
 
 
' Textdatei löschen und Objekte aus dem Speicher entfernen
If fs.FileExists(fn) Then
  fs.DeleteFile(fn)
End if
set fs = nothing
set wshShell = nothing

Backup aller mySQL Datenbanken

Ein komplettes Backup aller mysql-datenbanken lässt sich mit dem Befehl:

mysqldump -A -a -C -c -e --user=root --password=****** > dump.sql

durchführen.

Die Optionen bedeuten hier:

Kurze OptionLange OptionBedeutung
-A–all-databasesAlle Datenbanken sichern
-a–create-optionsErstellungseigenschaften der Tabelle einfügen
-C–compressDen Datenverkehr zwischen mysql Server und Client komprimieren
-c--complete-insertDie Spaltennamen in der Datei ausschreiben, also z.B.

 

INSERT INTO `table` VALUES
(1, 'Zeile1'),
(2, 'Zeile2'),
(3, 'Zeile3');
-e--extended-insertMehrere Reihen in eine Abfrage kombinieren
 
--skip-extended-insert

Da die Option --extended-insert seit längerem Standard ist, kann man mittels --skip-extended-insert
diese Option ausschalten und bekommt ein INSERT Statement pro Zeile, z.B.

INSERT INTO `table` VALUES (1, 'Zeile1');
INSERT INTO `table` VALUES (1, 'Zeile2');
INSERT INTO `table` VALUES (1, 'Zeile3');
(da diese Art sehr langsam ist, wird sie nur für kleine Tabellen oder zu Analysezwecken so empfohlen)

Hier noch eine Erklärung des Unterschieds zischen –complete-insert und –extended-insert.

[stextbox id=“tip“ caption=“Tipp“]
Will man das Passwort nicht unbedingt an der Konsole im Klartext eingeben, kann man mit der Zeile:

mysqldump -A -a -C -c -e --user=root --password &gt; dump.sql

auch erreichen, dass ein Abfrage-Dialog erscheint und man das Passwort ohne Anzeige eingeben kann. (Dies funktioniert natürlich NICHT in automatischen Scripts… :D)
[/stextbox]

Dies ist für automatische Sicherungen aller Datenbanken praktisch.

Eine einzelne Datenbank kann man aber auch einfach wie folgt sichern (z.B. als „Quick Backup“ vor einem Applikations-Update):

mysqldump -u BENUTZER -p DB_NAME > db.sql

Wieder eingespielt wird das Backup mit dem Befehl:

mysql < backup-file.sql

Will man hingegen nur eine bestimmte Datenbank wieder einlesen, geschieht dies mit dem Befehl:

mysql DB_NAME < backup-file.sql

Evtl. muss man natürlich auch beim Einspielen den Benutzernamen und Passwort eingeben:

mysql --user=root --password < backup-file.sql

Dateien inluden

Um in Shellscripts Dateien, z.B. mit Variablen einbinden zu können, muss die includierte Datei auch ein Shellscript, d.h. ausführbar sein!

Sobald man mal etwas komplexere Unix/Linux Shellscripts schreibt, sucht man nach einer Möglichkeit Dateien zu "inkludieren".
 
Dies ist mit dem Konstrukt:
. /pfad/zu/script_mit_variablen.sh
ganz einfach möglich.
 
 
Bei vielen Programmen (apache z.B.) ist es zudem auch möglich ganze Verzeichnisse (bzw. alle Dateien darin) zu inkludieren.
 
So kann man z.B. in der apache httpd conf mittels:
 
include /verzeichnis/configs/*.conf
 
alle Dateien im Verzeichnis "/verzeichnis/configs/" einbinden. die die Endung.conf haben. Die Angabe von:
 
include /verzeichnis/configs/*
 
würde dann entsprechend alle Dateien in diesem Verzeichnis einbinden.
 
Besonders gut macht sich dies um die Konfiguration in viele kleine Dateien aufzusplitten, z.B. in Apache für jeden VirtualHost eine eigene Datei:
 
include /etc/apache/vhosts/*.vhost

Passwort im shell script ändern

Manchmal möchte man in einem shell script das passwort ändern- bzw. setzen; von einem direkten editieren von /etc/shadow sollte jedoch abgesehen werden und auch sollte das passwort nicht unverschlüsselt im script stehen.

Zum Glück gibts da das Programm chpasswd, mit dem man im script passwörter ändern/setzen kann. 😉

chpasswd --encrypted <<EOF
root:$ROOTPW
EOF

Kommentarzeilen Entfernen

Als ich wieder mal eine Übersicht meiner Konfigurationsdateien brauchte, suchte ich nach einer Lösung die Kommentarzeilen von Files zu entfernen.

Auch wenn man seine Konfiguration hilfesuchend an eine Mailingliste oder ein Forum senden möchte, stören die Kommentare mehr als dass sie nützen.

Dies muss man lediglich in einer Datei namens confcat speichern, die im $PATH ist (z.B. ~/bin oder /usr/local/bin) und diese Datei dann mit: <I>chmod 755 /pfad/zu/confcat</I> ausführbar machen.

Quelle: http://de.gentoo-wiki.com/Kommentare_entfernen
Original-Thread im Gentoo-Forum: http://forums.gentoo.org/viewtopic.php?t=160179

#!/bin/bash
# Code to cat a config file removing all comments and blank lines.
 
grep -vh '^#' "$@" | grep -v '^$'