Montag, 9. Juli 2012

Todo in Latex

Ich hatte nach einem Tool gesucht um mir selbst ToDo-Notizen innerhalb meiner Diplomarbeit machen zu können und bin auf das Todonotes-Package (PDF) gestoßen.

Damit lassen sich sehr angenehm über


\todo{Notiz}


an jeder Stelle Notizen einfügen, die dann so aussehen: 



Ausserdem kann man mit

\missingfigure{Klassendiagramm}


auf eine noch einzufügende Grafik - etwa, wie hier, ein Klassendiagramm hinweisen.


An beliebiger Stelle (sinnvollerweise am Anfang) im Dokument, lässt sich über


\listoftodos

eine Liste aller ToDos einfügen.

Montag, 2. Juli 2012

Unterstrich in LaTeX

Einen simplen Unterstrich in LaTeX zu schreiben ist nicht trivial. Innerhalb von

\begin{verbatim}


\end{verbatim}

ist das kein Problem, aber im normalen Text gibt's einen Fehler. Daher verwendet man

\textunderscore 



Schöne Grafiken

Zu allererst mal muss ich Werbung machen, für eine Seite mit der ich alle Grafiken für meine Dimplomarbeit erstelle, da sie

  • komfortabel zu bedienen ist
  • ansprechende Resultate liefert
  • alle Dokumente online speichert
  • eine hochaufgelöste Ausgabe ermöglicht und
  • kostenlos* ist

*Diagramme sind mit dem kostenlosen Account auf eine bestimmte, maximal Komplexität reduziert, ich stoße aber so gut wie nie an diese Grenze.




Und nein, ich bekomme nix von denen ;) Ich dachte nur, ich gebe was zurück, dafür, dass ich meine ganzen Diagramme kostenlos und in schicker Optik erstellen durfte ...

aaaand, we're back

nach mehr als dreijähriger Abstinenz hat mich meine Diplomarbeit dazu motiviert, wieder zu bloggen. In Zukunft hier also wieder Material zu Linux, LaTeX, SIP, Java usw.

Freitag, 6. März 2009

Wie man mit Visual Studio 2008 Express Edition (VB.net) eine Verbindung zu einem entfernten SQL Server herstellt

Der Express Edition von Microsofts Visual Studio fehlen leider die Tools um eine Verbindung zu einer entfernten SQL-Datenbank herzustellen. Man kann mit dem Assistenten zwar eine Verbindung zu einer lokalen Instanz herstellen, aber wir wollen ja eine Client-Server Datenbankanwendung basteln. Und zwar "für lau".

Deswegen hier eine kurze Anleitung, wie ich ohne viel Drumherum eine entsprechende Verbindung herstellen kann, ohne die entsprechenden Tools und Assistenten.

Nachdem wir ein neues Projekt (Windows Forms Anwendung) angelegt haben,
basteln wir uns zunächst einmal ein Formular namens frmStart, darauf kommt ein Textfeld Namens txtFeld. Das wars dann auch schon fürs Erste mit Formular basteln.

Ich setze in diesem Beispiel der EInfachheit halber vorraus, dass ihr einen funktionierenden SQL Server im Netz habt, bei dem (falls SQL Express) Remote Connections aktiviert sind!

hier der Code:


Public Class frmStart

Private Sub frmStart_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

Dim cmdSQL As SqlClient.SqlCommand
Dim asyncResult As System.IAsyncResult
Dim returnValue As SqlClient.SqlDataReader
Dim strSQL As String

Using conSQL As New SqlClient.SqlConnection("Data Source=[SERVERNAME/INSTANZ];Initial Catalog=[DATENBANKNAME];User Id=[USERNAME];Password=[PASSWORT];Async=true")
conSQL.Open()
strSQL = "[SQLSTRING]"
cmdSQL = New SqlClient.SqlCommand(strSQL, conSQL)
asyncResult = cmdSQL.BeginExecuteReader()
returnValue = cmdSQL.EndExecuteReader(asyncResult)
If returnValue.Read() Then
Me.txtFeld.Text = returnValue.Item("[FELDNAME]")
End If
End Using
End Sub
End Class




Was bedeutet das nun im Einzelnen?

Die Variablendeklaration:

Dim cmdSQL As SqlClient.SqlCommand
Dim asyncResult As System.IAsyncResult
Dim returnValue As SqlClient.SqlDataReader
Dim strSQL As String

  • cmdSQL ist das Commandobjekt, also der Behälter für unseren SQL-Befehl
  • asyncResult gibt Auskunft über den Status der asynchronen Operation (neu in ADO.net 2.0 - zum Thema asynchrone/synchrone Operationen bitte Googel bemühen, das führt hier zu weit)
  • returnValue ist das Readerobjekt, dass nachher unser Resultset enthalten soll
  • strSQL ist lediglich die Stringvariable für unseren SQL-Befehl
Das Verbinden mit dem Datenbankserver:

Using conSQL As New SqlClient.SqlConnection("Data Source=[SERVERNAME/INSTANZ];Initial Catalog=[DATENBANKNAME];User Id=[USERNAME];Password=[PASSWORT];Async=true")
conSQL.Open()


  • Using [Connection-Variable] As New SqlClient.SqlConnection([Connection String]) sorgt dafür, dass wir die mit dem Connection-String definierte Verbindung innerhalb der Using-Anweisung verwenden. Wie der Connection String aussehen soll? --> http://www.connectionstrings.com/ Der Connectionstring muss die Anweisung "Async=true;" enthalten, damit das mit der asynchronen Operation funktioniert!
  • conSQL.Open() öffnet die Verbindung schlussendlich
Befehl senden/Resultat empfangen:

strSQL = "[SQLSTRING]"
cmdSQL = New SqlClient.SqlCommand(strSQL, conSQL)
asyncResult = cmdSQL.BeginExecuteReader()

  • strSQL = "..." hier definieren wir unseren SQL String, also SELECT * FROM tblIrgendwas
  • dann wird dem Command-Objekt der SQL String und die Connection an die der Befehl gehen soll übergeben
  • und wir weisen den Status der Async-Operation der zuvor definierten Variable zu
Anzeigen der Daten:

returnValue = cmdSQL.EndExecuteReader(asyncResult)
If returnValue.Read() Then
Me.txtFeld.Text = returnValue.Item("[FELDNAME]")

  • unserem Readerobjekt "returnValue" weisen wir das Resultat der Abfrage zu ...
  • ... dann, wichtige Sache, erst wenn das Readerobjekt fertig gelesen hat...
  • ...weisen wir dem Textfeld einen Wert zu! Wenn dieses if fehlen würde, kommt es höchstwarscheinlich zu einem Fehler, da das Programm schneller in der nächsten Zeile ist, als dass der Server das Resultat geliefert hat! Es kommt dann der Fehler:
    "Um eine indizierte Eigenschaft auszuwerten, muss die Eigenschaft qualifiziert sein, und die Argumente müssen explizit vom Benutzer bereitgestellt werden." (Item) und
    "Ungültiger Leseversuch, wenn keine Daten vorhanden sind." (Message)
und das Gedöns ...

End If
End Using
End Sub
End Class

  • alles wieder zumachen, was wir aufgemacht haben
Dann F5 drücken und freuen, dass in dem Textfeld der Inhalt des Feldes angezeigt wird, dass ihr abgefragt habt. tata!

Automatisieren von Backups mit SQL Server Express Edition

Der (sonst absolut fantastischen) Express Edition des SQL Servers von Microsoft fehlen einige Features der teuren Versionen, so zum Beispiel der Agent für das automatische Ausführen immer wiederkehrender Tasks (e.g. Backups).
Um trotzdem regelmäßig automatische Backups machen zu können gibts verschiedene Möglickeiten. Ich nutze zum Beispiel ein kleines Tool namens SQLScheduler, dass zu vorgegebenen Zeiten SQL-Befehle ausführt und bei Erfolg und/oder Fehlschlag Mails verschicken kann.

Es gibt aber natürlich auch Mittel und Wege, komplett mit Windows/SQL Server Bordmitteln allein eine entsprechende Lösung zu erstellen:

mit VBScript/Windows Scheduler

mit SQLCMD und Windows Scheduler

mit SQL Server Service Broker

Viel Spass beim Backuppen (und nicht vergessen master und msdb mit zu sichern ;)